から派生したFoo<T>
との2 つのクラスがあります。それぞれが methodをオーバーライドします。ここで、 はorの特定のインスタンス化を一意に識別する型のインスタンスです(それが であるふりをします)。問題は、がインスタンスを返せるようにする必要があり、同様に をインスタンス化できる必要があることです。どちらもテンプレートであるため、 と の間に循環依存関係が発生します。これを解決するにはどうすればよいですか?Bar<T>
Base
virtual Base* convert(ID) const
ID
Foo
Bar
enum
Foo::convert()
Bar
Bar::convert()
Foo
Foo.h
Bar.h
編集:各メソッドの実装には他のクラスのコンストラクターが必要なため、前方宣言は機能しません。
Foo.h
:
#include <Base.h>
template<class T> class Bar;
template<class T>
class Foo : public Base { ... };
template<class T>
Base* Foo<T>::convert(ID id) const {
if (id == BAR_INT)
return new Bar<int>(value); // Error.
...
}
Bar.h
:
#include <Base.h>
template<class T> class Foo;
template<class T>
class Bar : public Base { ... };
template<class T>
Base* Bar<T>::convert(ID id) const {
if (id == FOO_FLOAT)
return new Foo<float>(value); // Error.
...
}
エラーは、当然、「不完全な型の無効な使用」です。