(2012)Visual C ++ LNK2019错误,可能是模板问题?

时间:2013-08-24 23:17:51

标签: c++ templates visual-c++ visual-studio-2012

所以我得到一个未解决的外部符号错误,我无法弄清楚原因。所有文件都存在于同一个项目中,编译器似乎正在生成所有obj文件。我从模板类派生,所以我想也许我没有正确地声明我的派生方法。我在VS 2012中使用visual c ++编译器。

BaseClass.h

template<class T> class BaseClass
{
public:
    BaseClass() {}

    virtual ~BaseClass() {}

    void Foo();
}

BaseClass.cpp

#include "BaseClass.h"

template<class T> void BaseClass<T>::Foo()
{
    cout << "hello";
}

SomeClass.h

#include "BaseClass.h"

class SomeClass : public BaseClass<long>
{
    public:
       SomeClass() {}

       void DoSomething();
}

SomeClass.cpp

#include "SomeClass.h"

void SomeClass::DoSomething()
{
     Foo(); // link error
     this->Foo(); // also gives link error
     BaseClass<long>::Foo(); // also gives link error
}

因此,由于链接错误,DoSomething()似乎无法从其基类调用任何内容。这里有什么明显的东西我做错了吗?

2 个答案:

答案 0 :(得分:2)

创建模板时,编译器会使用给定的模板参数创建一个新类。因此,编译器需要能够访问方法的实现,并且无法将其链接。因此,您无法将植入分离为.cpp文件。

如果您真的想将声明与植入分开,那么您应该查看.inl个文件。您可以阅读有关他们的更多信息here

答案 1 :(得分:1)

使用带模板的类时,需要在其头文件中提供定义,而不是单独的.cpp文件。