0

私はC++でそれを行うことが可能かどうか知りたいです:

 template <typename T> class A { T link;};
 template <typename U> class B { U link;};

 class AA : A<BB> {};
 class BB : B<AA> {};

エラーが発生するため:

 error: ‘BB’ was not declared in this scope
 error: template argument 1 is invalid

私はexpect宣言を使用しようとしました:

 class AA;
 class BB;

 class AA : A<BB> {};
 class BB : B<AA> {};

しかし、それは機能しませんでした:

 In instantiation of ‘A<AA>’:
 error: ‘A<T>::s’ has incomplete type
 error: forward declaration of ‘struct AA’

ご協力ありがとうございました、

4

2 に答える 2

5

問題はテンプレートではなく、無限のネストです(そして、技術的には、不完全な型を使用してメンバーを定義することからです)。テンプレートを削除すると、同じ問題が発生します。

struct A;
struct B;

struct A { B x; };

struct B { A y; };

概念的には、これは機能しません。なぜなら、実際、ここで得られるのは、…から無限大を含むをA含むを含むです。カメはずっと下にいます。BAB

ただし、機能するのは、代わりにポインターメンバーを使用することです。これらは不完全な型で機能するため、コードは機能します。テンプレートでも機能します。

template <typename T> class A { T* link;};
template <typename U> class B { U* link;};
于 2012-05-08T10:40:16.850 に答える
0

私がしばらく前に尋ねたこの質問をチェックしてください。テンプレートクラスを前方宣言する方法

基本的に、テンプレートタイプを前方宣言する場合は、すべてのテンプレートパラメータを指定する必要があります。

于 2012-05-08T10:13:04.100 に答える