如何在C ++模板中使用类作为参数

时间:2016-07-20 11:35:19

标签: c++ c++11 templates template-specialization

A: 我使用这样的东西:

在Class1.h中:

template <class T>
class Class1 : Database {
public:
    Class1();
};

在Class1.cpp中:

#include "Class1.h"

template <typename T>
Class1<T>::Class1(){
   //Some code
}

致电课程:

#include "Class1.h"

Class1<Class2> *class1 = new Class1<Class2>();

如果我运行它,链接器将无法找到“Class1”。

B: 当我使用这样的东西时:

#include "Class1.h"

template <> Class1<Class2>::Class1(){}

链接器能够找到它。

我的问题是,我需要在代码中使用A而不是B.

这意味着我不想使用:

template <> Class1<Class2>::Class1(){}

我只想使用

template <typename T>
Class1<T>::Class1(){
   //Some code
}

所有教程都说我正确使用它并且它必须工作。有人能帮助我吗?

2 个答案:

答案 0 :(得分:6)

当您尝试实例化类模板的特化时,编译器需要访问每个成员定义,否则无法生成相应的代码(C ++模板基本上是类固醇的copypasta工厂)。

由于您将实现细节拆分为单独的文件,因此无法实例化特定的专业化a.k.a. Class1<Class2>。我想你把template <> Class1<Class2>::Class1() {}位放在头文件中?如果是这样,您的代码会编译,因为它在您的样本中使用时具有可用构造函数的Class2的完全特化。

示意你有:

  

模板标题 - &gt;包含在 - &gt;中测试样本cpp文件
  \ -----------------------&GT;包含在 - &gt;中模板实现cpp文件

您可以看到您的模板的所有实际实现都无法在您的测试样本翻译单元中访问。

答案 1 :(得分:1)

如评论中所述,Class1是一个模板化的类,所以你应该把你的构造函数放在头文件中,而不是放在一个单独的cpp文件中。 否则,您可以将构造函数放在使用它的cpp文件中,但前提是仅在单个cpp文件中使用它。

问题是当你写

Class1<Class2> *class1 = new Class1<Class2>();

您要求编译器调用(并构造)Class1<Class2>的构造函数,但编译器不知道如何构造它,因为它在另一个文件中定义(编译器,在这个阶段,只看到&#34; Class1.h&#34 ;;不知道&#34; Class1.cpp&#34;)的内容。

你的解决方案B

template <> Class1<Class2>::Class1(){}

有效,因为您正在为Class1<Class2>定义构造函数特化,所以编译器知道它

解决方案:删除

template <typename T>
Class1<T>::Class1(){
   //Some code
}

来自&#34; Class1.cpp&#34;并把它放在&#34; Class1.h&#34;。

p.s:抱歉我的英语不好。