所以我得到一个未解决的外部符号错误,我无法弄清楚原因。所有文件都存在于同一个项目中,编译器似乎正在生成所有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()似乎无法从其基类调用任何内容。这里有什么明显的东西我做错了吗?
答案 0 :(得分:2)
创建模板时,编译器会使用给定的模板参数创建一个新类。因此,编译器需要能够访问方法的实现,并且无法将其链接。因此,您无法将植入分离为.cpp
文件。
如果您真的想将声明与植入分开,那么您应该查看.inl
个文件。您可以阅读有关他们的更多信息here。
答案 1 :(得分:1)
使用带模板的类时,需要在其头文件中提供定义,而不是单独的.cpp文件。