テンプレート化されたスーパークラスを使用して、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
簡単なGoogleは、次を追加すると問題が解決することを示唆しています。
template<> Templated<Base>::Templated(int a);
template<> int Templated<Base>::Foo();
しかし、これでは問題は解決しません。行を追加してmain.cpp
も機能しません。(興味深いことに、それらを両方に追加すると、リンカーから「複数定義されたシンボル」エラーが発生するため、何かをしているに違いありません...)
ただし、すべてのコードを 1 つのソース ファイルに入れると、問題は解決します。これは上記の厄介な例では問題ありませんが、私が見ている実際のアプリケーションは、すべてを 1 つの cpp ファイルに入れることを余儀なくされた場合、非常に速く管理できなくなります。
私がやっていることさえ可能かどうか誰にも分かりますか? (どのように) リンカー エラーを解決できますか?
すべてのメソッドをインラインで作成でき、これでうまくいくと思いますがclass Templated
、これも理想的ではないようです。