コンパイルするコードのセクションを含む大規模なプロジェクトに取り組んでいますが、その方法がわかりません。私はそれを次の簡単な例に絞り込みました。
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)
について不平を言います。typedef
Second
このコードがコンパイルされるのはなぜtypedef
ですか? また、 とメンバー変数の順序が重要なのはなぜですか?