【问题标题】: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;
}

【问题讨论】:

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

标签: c++ constructor


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-22
    • 2023-03-13
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 2012-02-03
    相关资源
    最近更新 更多