如何在模板类之外定义构造函数

时间:2014-01-31 19:46:39

标签: c++ constructor

如果我在类之外定义模板类的构造函数\析构函数,则会出现链接器错误。不允许吗? 我使用Visual Studio 2010。

错误 1> main.obj:错误LNK2019:函数_main

中引用的未解析的外部符号“public:__thiscall Tree ::〜Tree(void)”(?? 1?$ Tree @ H @@ QAE @ XZ)

1> main.obj:错误LNK2019:未解析的外部符号“public:__thiscall Tree :: Tree(void)”(?? 0?$ Tree @ H @@ QAE @ XZ)在函数_main中引用

在.h文件中

template <class T>
class Tree{
public:
    Tree(void);
    ~Tree(void);
    T x;
};

在.cpp文件中

#include "Tree.h"

template <class T> Tree<T>::Tree(void){
}

template <class T> Tree<T>::~Tree(void){
}

在main.cpp文件中

#include "Tree.h"
int main(){
    Tree<int> t;
    return 0;
}

1 个答案:

答案 0 :(得分:3)

模板需要在您包含的文件中声明和实现。您不能将模板类声明和实现分开,然后只包含头文件。

使用模板时,在使用之前不会编译该类。因此,没有可以链接的已编译模板类。每次使用模板时,都必须针对不同的类型进行编译。由于编译器无法访问实现,因此它不知道如何编译它......