【问题标题】:Call Base Default constructor Template Class [duplicate]调用基默认构造函数模板类[重复]
【发布时间】:2014-02-05 08:12:41
【问题描述】:

问题是如何从继承的模板类中调用基本构造函数。我想创建一个 FixedQueue 并在 std::queue 中重载一些函数。因此 std:queue 是基类。从 c++11 开始,关键字 using 可用于调用基类,如果这是一个专门的类,它可以工作,但我不能让它与模板类一起使用。

此外,我尝试使用旧的 c++ 标准,在该标准中我只需调用 std::queue 中定义的构造函数。但是它不起作用。

h 文件

#ifndef _HEADER_FIXED_QUEUE_
#define _HEADER_FIXED_QUEUE_

#include <queue>
#include <iostream>

template<class T> 
class FixedQueue : public std::queue<T>
{
  //using queue<T>::queue<T>;

  public:
    FixedQueue();
    FixedQueue(const T &initial_var);
    void foo() { std::cout << "inside\n"; }

};

#endif

cpp 文件

#include "FixedQueue.h"

template<typename T>
FixedQueue<T>::FixedQueue()
:
  std::queue<T>()
{ 
  std::cout << "Default Constructor FixedQueue\n";
}

template<typename T>
FixedQueue<T>::FixedQueue(const T &initial_var)
:
  std::queue<T>(initial_var)
{ 
  std::cout << "Specialized Constructor FixedQueue\n";
}

主文件。

#include <iostream>
#include "FixedQueue.h"

int main()
{
  FixedQueue<int> d_frameSlices;


  std::cout << "I want to do something with my queue\n";
}

问题是这样的。如何将构造函数链接到基类 std::queue 中定义的构造函数。模板的东西让我很生气。

这是我从 clang 获得的错误信息,通常是未定义的引用。

Undefined symbols for architecture x86_64:
  "FixedQueue<int>::FixedQueue()", referenced from:
      _main in main-lqoFSA.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

如果有人知道如何使用“使用”或旧时尚方式来做到这一点,我对两者都很满意。提前致谢

【问题讨论】:

  • 你用的是clang还是clang++?
  • 类模板*(区别有助于概念化模板是什么以及它们如何工作)
  • 我不明白这与using 有什么关系。您将函数定义放在错误的位置。相当标准的模板错误?
  • 我需要告诉编译器 T 是类中的模板类型。否则我会得到类似“未知类型名称'T'”的错误

标签: c++ templates queue default-constructor constructor-chaining


【解决方案1】:

你不应该把模板放在cpp文件中,把它全部放在头文件中

【讨论】:

  • 这不是问题。我在头文件中声明类并在cpp中实现函数。这些需要模板定义才能知道所需的类型,如果函数是模板函数,它 deff 需要该声明
  • @Montaldo:你没有在听。这个问题。不要执行 CPP 中的功能。这不是一个,而是一个类模板
  • 你说得对,但不可能在 cpp 文件中实现它们。通常,与模板有关的所有其他事情我都能做到这一点。你能帮我详细说明一下吗?
  • @Montaldo:不,不是真的。模板的函数定义必须在 每个 翻译单元中可见。您的 C++ 书中没有说明这一点吗?有关更多信息,请参阅几分钟前在 cmets 中发布的 Alf 链接。
  • 啊不,我错了。你是对的,为什么这有效的原因是我曾经在标题中包含我的 cpp 文件。有点黑客。感谢您的努力和解释。
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2014-05-18
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2013-11-06
  • 2013-05-30
相关资源
最近更新 更多