【发布时间】:2013-08-24 23:17:50
【问题描述】:
所以我得到一个未解决的外部符号错误,我不知道为什么。所有文件都存在于同一个项目中,编译器似乎正在生成所有 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() 方法似乎无法从其基类调用任何内容。有什么明显的地方我做错了吗?
【问题讨论】:
-
模板方法的通用实现需要在 *.h 或 *.inl 中,这将在 *.h 文件的末尾被 #include 。在 *.cpp 中指定模板类需要的实现。
-
谢谢这是解决方案。第一次在 C++ 中使用模板,不知道模板定义必须在标题中。
标签: c++ templates visual-c++ visual-studio-2012