我试图创建一个C++类,与模板超类。我的想法是,我可以很容易地从许多具有类似特征的超类中创建很多类似的子类。模板超类链接问题
我已经蒸出有问题的代码,如下所示:
template_test.h
:
template<class BaseClass>
class Templated : public BaseClass
{
public:
Templated(int a);
virtual int Foo();
};
class Base
{
protected:
Base(int a);
public:
virtual int Foo() = 0;
protected:
int b;
};
template_test.cpp
:
#include "template_test.h"
Base::Base(int a)
: b(a+1)
{
}
template<class BaseClass>
Templated<BaseClass>::Templated(int a)
: BaseClass(a)
{
}
template<class BaseClass>
int Templated<BaseClass>::Foo()
{
return this->b;
}
main.cpp
:
#include "template_test.h"
int main()
{
Templated<Base> test(1);
return test.Foo();
}
当我构建代码时,出现链接器错误,说找不到符号Templated<Base>::Templated(int)
和Templated<Base>::Foo()
。
快速谷歌认为,加入以下main.cpp
就能解决问题:
template<> Templated<Base>::Templated(int a);
template<> int Templated<Base>::Foo();
但这并不解决问题。将行添加到main.cpp
也不起作用。 (不过,有趣的是,把它们添加到都给出了“乘法定义符号”从链接错误,所以他们必须做什么......)
然而,把所有的代码在一个源文件不解决问题。虽然这对于上面的noddy例子来说是可以的,但是如果我被迫将整个文件放在一个cpp文件中,那么我所看到的真正的应用程序将非常快速地变得难以管理。
有谁知道我在做甚么可能吗? (如何)我可以解决我的链接器错误?
我会假设我可以在class Templated
内联所有的方法,这将工作,但这似乎并不理想。
Chris,也许你可以添加澄清,模板实现不能进入单独的编译单元(= cpp文件)。 – 2008-10-16 08:09:45
不要忘记删除显式实例,让编译器自动处理它。 此外,对BaseClass :: b的调用可以用this-> b来替换。 – bltxd 2008-10-16 08:14:16