0

重複の可能性:
CRTP と typedef を使用した「継承された」型

template<typename T>
struct A {
  typename T::Sub  s;
};

struct B : A<B> {
  struct Sub {};
};

Clang は次のエラーを報告しています:

todo.cc:3:15: error: no type named 'Sub' in 'B'
  typename T::Sub  s;
  ~~~~~~~~~~~~^~~
todo.cc:6:12: note: in instantiation of template class 'A<B>' requested here
struct B : A<B> {
           ^

どうすればこれを機能させることができますか?

4

2 に答える 2

2

Bのインスタンス化を要求する時点で、 は不完全なクラスですA<B>

Bこれは、のテンプレート メソッド内でのみ参照できることを意味します。それらのインスタンス化は が完了Aするまで遅れます。B

于 2012-07-23T17:07:19.577 に答える
1

からB継承しているためA<B>、 is のA<B>に構築する必要があります。 B

CRTP を使用しているため、これは が構築されているBときに不完全なクラスであることを意味します。A<B>このため、コンパイラはBメンバー フィールド があるかどうかを判断Subできず、コンパイルに失敗します。

今回は、gcc がより意味のあるエラーを出すことに注意してください。

$ 猫 crtp.cpp

template<typename T>
struct A {
      typename T::Sub  s;
};

struct B : A<B> {
      struct Sub {};
};

$ g++ -c crtp.cpp -o crtp.o

crtp.cpp: In instantiation of ‘A<B>’:
crtp.cpp:6:17:   instantiated from here
crtp.cpp:3:21: error: invalid use of incomplete type ‘struct B’
crtp.cpp:6:8: error: forward declaration of ‘struct B’
于 2012-07-23T17:15:53.220 に答える