これは、言語に関する質問というよりも、ベスト プラクティスに関する質問です。なぜなら、C++ でよくあるつまずきのブロックと思われるものに対する有効な解決策が既にあるからです。
テンプレート パラメーターの置換における典型的な循環依存の問題を扱っています。次のクラスのペアがあります。
template<class X>
class A { /* ... */ };
template<class X>
class B { /* ... */ };
そして、それぞれを次のようにインスタンス化したいと思います:
// Pseudocode -- not valid C++.
A<B> a;
B<A> b;
つまり、A を B に、B を A に「バインド」したいということです。
継承トリックを使用した前方宣言を通じて、問題を大まかに解決できます。
class sA;
class sB;
class sA : public A<sB> { /* ... */ };
class sB : public B<sA> { /* ... */ };
しかし、 とは実際には と ではないのでsA
、これは一連の問題を引き起こします。たとえば、のコンストラクターを に適切に複製したり、何らかの形でコードの周りにきらめくキャストをしたりせずに、 のコンストラクターを呼び出すことはできません。sB
A
B
A
sA
私の質問は、この問題に対処するための最も実用的な方法は何ですか? この問題に対する特別に賢い解決策はありますか?
MSVC2008 と G++ の両方を使用していますが、コンパイラ固有の拡張機能を使用したソリューションは大歓迎です。
ありがとう、
アレク