1

ヘッダー内にこのコードがあります(編集済み):

template <int i> class A {};
template <> class A <1> { B<1> _b; };

template <int i> class B : public A <i> {};
template <> class B <1> : public A <1> {};

そして、どういうわけか次のように使用します:

#include "template_A_B.h"
int main ()
{
   A<1> a;
   B<1> b;
   return 0;
}

明らかに、コンパイルエラーが発生します:

error: ‘B’ does not name a type

B の前方宣言を追加すると

template <int i> class B;

私は得る

error: field ‘_b’ has incomplete type

コンパイル時。

また、 A を前方宣言し、クラス定義の順序を切り替えて、次を取得しようとしました。

error: declaration of ‘struct A<1>’
4

1 に答える 1

2

質問の最初の定式化では、前方宣言の後に専門分野を配置するだけで済みました。その後、すべてが正しく解決されます。

template <int i> class A;
template <int i> class B;

template <> class A <1> {};
template <> class B <1> : public A <1> {};

template <int i> class A { B<1> _b; };
template <int i> class B : public A <i> {};

改訂された質問では、テンプレート以外のタイプでも許可されていない、それ自体を含めようとする構造を作成しました。たとえば、次の定義は許可されていません。

struct A { B b; };
struct B : public A {};

Aただし、への間接参照を使用するように変更すると、目的に近い処理を実行できますB

struct B;

struct A { B *b; };
struct B : public A {};
于 2012-06-29T08:41:00.363 に答える