C++ 模板,不同的声明和定义,链接器无法解析符号 [重复]

C++ Template, different declaration and definition, linker not able to resolve the symbols [duplicate]

提问人: 提问时间:2/12/2014 更新时间:2/12/2014 访问量:78

问:

这里给出的简单模板代码;只是我正在写单独的声明和定义

这是我的头文件

template <typename T>
class SmartPointerGen
{
private:
        T*  pData;

public:
        SmartPointerGen(T* pValue);
        ~SmartPointerGen();

        T&  operator* ();
        T*  operator-> ();
};

这就是我定义方法的方式

    #include "SmartPointer_Generic.h"

    template <typename T> 
    SmartPointerGen<T>::SmartPointerGen(T* pValue) :    pData(pValue)
    {

    }

    template <typename T>
    SmartPointerGen<T>::~SmartPointerGen()
    {
        delete pData;
    }

    template <typename T>
    T&  SmartPointerGen<T>::operator* ()
    {
        return *pData;
    }

    template <typename T>
    T*  SmartPointerGen<T>::operator-> ()
    {
        return pData;
    }

在 中,我尝试将相同的main()

SmartPointerGen<Person> pPersonGen(new Person("WTF Again"));

我相信问题出在类的定义上,我尝试按照这种语法在类之外定义模板化方法,但链接器说的是析构函数和重载运算符的未解析符号,(但不是构造函数)。SmartPointerGen

错误:(只显示 1,其他都非常相似)

main.obj : error LNK2019: unresolved external symbol "public: __thiscall SmartPointerGen<class Person>::SmartPointerGen<class Person>(class Person *)" (??0?$SmartPointerGen@VPerson@@@@QAE@PAVPerson@@@Z) referenced in function _main

C++ 模板 链接器错误未 解决外部

评论


答:

2赞 Arsenii Fomin 2/12/2014 #1

您必须在声明模板的同一头文件中定义模板 - 这是语言限制。

评论

0赞 2/12/2014
方法。。?没有完全得到你..我的意思是我不能在头文件中编写类并在其他文件中编写方法定义吗?是这样吗,这是因为模板需要两阶段编译吗?
1赞 Ferenc Deak 2/12/2014
意味着:所有代码都应该放在头文件中,模板没有 CPP(除非你也包括 CPP 文件)
0赞 Arsenii Fomin 2/12/2014
是的,所有模板代码都应该在头文件中。
1赞 Angew is no longer proud of SO 2/12/2014
不一定在同一个文件中。它可以位于任何位置,只要定义在使用模板的每个文件中可见即可。
1赞 Sigi 2/12/2014
由于这是我同意的答案,如果您事先知道哪些数据类型将使用模板(也就是说 - 这不是一个库),您可以查看此 SO 问题和答案