私はこの問題に頭を悩ませています。実際には不可能だと思いますが、念のためここで実際に解決策があるかどうかをお聞きしたいと思います。次のコードを検討してください。2つのテンプレートクラスAとB、および2つの非テンプレートクラスCとDがあり、それぞれAとBから派生しています。
// definition of class A
template <class DerivedA, class DerivedB> class A {
private:
DerivedB data;
public:
A(const DerivedB& data) : data(data) {}
virtual ~A() {}
DerivedB get() const { return data; }
};
// definition of class B
template <class DerivedA, class DerivedB> class B {
private:
DerivedA data;
public:
B(const DerivedA& data) : data(data) {}
virtual ~B() {}
DerivedA get() const { return data; }
};
// forward declaration of D
class D;
// definition of class C, derives from A<C, D>
class C : public A<C, D> {
private:
int extraInfo;
public:
C(const D& d) : A(d) {}
virtual ~C() {}
int getExtraInfo() const { return extraInfo; }
};
// definition of class D, derives from B<C, D>
class D : public B<C, D> {
private:
int extraInfo;
public:
D(const C& c) : B(c) {}
virtual ~D() {}
int getExtraInfo() const { return extraInfo; }
};
ここでの問題は、クラスDは前方宣言されているだけなので、クラスCを定義できないことです。したがって、テンプレートAが書き出されると、プライベートメンバーのタイプがわかりません。ポインタを操作できないことに注意してください。いくつかの既知の機能が必要です。クラスCとDを持つようにコンパイルすることは可能ですか?