我正在尝试创建一个带有模板化超类的 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
也不起作用。(虽然,有趣的是,将它们添加到两者都会导致链接器出现“多重定义的符号”错误,因此它们必须在做某事......)
但是,将所有代码放在一个源文件中确实可以解决问题。虽然这对于上面的点头示例来说是可以的,但如果我被迫将全部内容放在一个 cpp 文件中,我正在查看的实际应用程序将很快变得难以管理。
有谁知道我正在做的事情是否可能?(如何)我可以解决我的链接器错误吗?
我会假设我可以将所有方法都设置为class Templated
inline 并且这会起作用,但这似乎也不理想。