【发布时间】:2014-01-31 19:46:39
【问题描述】:
如果我在类外定义模板类的构造函数\析构函数,我会收到链接器错误。不允许吗? 我使用 Visual Studio 2010。
错误 1>main.obj:错误LNK2019:函数_main中引用的未解析外部符号“public:__thiscall Tree::~Tree(void)”(??1?$Tree@H@@QAE@XZ)
1>main.obj : 错误 LNK2019: 函数 _main 中引用的未解析外部符号“public: __thiscall Tree::Tree(void)”(??0?$Tree@H@@QAE@XZ)
在.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;
}
【问题讨论】:
-
如果你真的想要一个单独的文件,你可以把它放在一个 .cpp 文件中,并在标题中 #include 那个 .cpp 文件。但是你必须从构建中排除它!
-
建议的解决方案并不详尽,抱歉迟到了。特别是,如果您希望允许 Tree 的客户端仅使用特定类型,您可以将 Tree.cpp 文件中的模板显式实例化为
template class Tree<int>;。这样做您实例化了int的模板,因此main.cpp可以将Tree模板与int一起使用,仅此而已。根据我的日常使用非常有用。
标签: c++ constructor