如何在模板类之外定义构造函数[重复]

Posted

技术标签:

【中文标题】如何在模板类之外定义构造函数[重复]【英文标题】:How to defined constructor outside of template class [duplicate] 【发布时间】: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;

【问题讨论】:

见:***.com/questions/5612791/c-template-and-header-files 如果你真的想要一个单独的文件,你可以把它放在一个 .cpp 文件中,并在标题中 #include 那个 .cpp 文件。但是你必须从构建中排除它! 建议的解决方案并不详尽,抱歉迟到了。特别是,如果您希望允许 Tree 的客户端仅使用特定类型,您可以将 Tree.cpp 文件中的模板显式实例化为template class Tree&lt;int&gt;;。这样做您实例化了int 的模板,因此main.cpp 可以将Tree 模板与int 一起使用,仅此而已。根据我的日常使用非常有用。 【参考方案1】:

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

使用模板,类在使用之前不会被编译。所以没有可以链接的编译模板类之类的东西。每次使用模板时,都必须针对不同的类型对其进行编译。而且由于编译器无权访问实现,它不知道如何编译它......

【讨论】:

以上是关于如何在模板类之外定义构造函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++:如何在派生类中定义基类构造函数,如果基构造函数具有带有私有成员的初始化列表[重复]

在构造类之外定义函数实例

非模板类的模板构造函数出现问题[重复]

C++:如何在结构中定义类实例。类具有参数化构造函数[重复]

如何调用嵌套类的构造函数[重复]

Python构造函数