コンパイルするコードのセクションを含む大規模なプロジェクトに取り組んでいますが、その方法がわかりません。私はそれを次の簡単な例に絞り込みました。
template <typename T>
struct First {
typedef int type; // (A)
typename T::Three order; // (B)
};
template <typename T> struct Second {
typedef typename T::type type;
};
template <typename T> struct Third {
int val;
T two;
};
struct Traits {
typedef First<Traits> One;
typedef Second<One> Two;
typedef Third<Two> Three;
};
int main(int argc, char** argv) {
Traits::One x;
};
クラスFirstはテンプレート化されてTraitsおりTraits::Three、それ自体がtypedefベースでTwoあり、typedefベースであるFirst<Traits>...を参照しているため、循環しています。しかし、このコードは gcc4.6 と VC10 の両方で正常にコンパイルされます。ただし、 と でマークされた 2 行の順序を逆にする(A)と、コードはコンパイルされず、 の内部(B)について不平を言います。typedefSecond
このコードがコンパイルされるのはなぜtypedefですか? また、 とメンバー変数の順序が重要なのはなぜですか?