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

8
如果我在类外定义模板类的构造函数/析构函数,会出现链接错误。这是不允许的吗?我使用的是Visual Studio 2010。
错误信息:
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Tree::~Tree(void)" (??1?$Tree@H@@QAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Tree::Tree(void)" (??0?$Tree@H@@QAE@XZ) referenced in function _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;
}

请查看以下链接:https://dev59.com/C2035IYBdhLWcg3wHsSR - sellsword
如果你真的想要一个单独的文件,你可以把它放在一个.cpp文件中,并在头文件中#include那个.cpp文件。但是你必须从构建中排除它! - Micka
提议的解决方案并不全面,抱歉晚了。特别地,如果你想让树(Tree)的客户端只使用特定类型,你可以在Tree.cpp文件中显式实例化模板,例如 template class Tree<int>;。这样做可以为int实例化模板,因此main.cpp 可以使用与int有关的Tree模板,而不会涉及其他数据类型。这对我日常使用非常有用。 - fiorentinoing
1个回答

6

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接