我試圖創建一個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