【问题标题】:C++ Template, different declaration and definition, linker not able to resolve the symbols [duplicate]C ++模板,不同的声明和定义,链接器无法解析符号[重复]
【发布时间】:2014-03-10 11:41:12
【问题描述】:

给定here做简单的模板代码;只是我正在编写单独的声明和定义

这是我的头文件

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&lt;Person&gt; pPersonGen(new Person("WTF Again"));

我认为问题出在SmartPointerGen 类的定义上,我尝试遵循this 语法来定义类外的模板化方法,但链接器说析构函数和重载运算符的符号未解析,(但不适用于构造函数)。

错误:(只显示1个,其他都差不多)

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

【问题讨论】:

    标签: c++ templates linker-errors unresolved-external


    【解决方案1】:

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

    【讨论】:

    • 意味着..?没有完全明白你..我的意思是我不能在头文件和方法def中编写类。在其他文件中?是这样吗,是因为模板需要两阶段编译吗?
    • 表示:所有代码都应该放在头文件中,模板没有CPP(除非你也包含CPP文件)
    • 是的,所有模板代码都应该在头文件中。
    • 不一定在同一个文件中。它可以在任何地方,只要定义在使用模板的每个文件中都是可见的。
    • 这是我同意的答案,如果您提前知道哪些数据类型将使用模板(即 - 这不是库),您可以查看this SO question and answers
    猜你喜欢
    • 1970-01-01
    • 2020-01-28
    • 2016-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多