私は大規模なプロジェクトに取り組んでいます。このプロジェクトには、コンパイルするコードのセクションが含まれていますが、どのように理解できません。したがって、それは円形である...自体がFirst<Traits>
に基づいてtypedef
である、Two
に基づいてtypedef
あるこのテンプレートコードはなぜコンパイルされますか?
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
、上のテンプレート化されています。私はこの単純な例にそれを蒸留しました。しかし、このコードはgcc4.6とVC10の両方でうまくコンパイルされます。しかし、(A)
と(B)
という2つの行の順序を入れ替えた場合、コードはコンパイルされず、Second
のtypedef
について不平を言っています。
なぜこのコードがコンパイルされ、typedef
とメンバー変数の順序が重要なのはなぜですか?
このようにツリーで紙に描画してみましょう:各定義のためにノードを作成し、型の各(順方向の)宣言を行い、完全な定義が必要で、宣言だけであり、それは円形ではないことがわかります。 – PlasmaHH
Hi - 無関係ですが、P0704が17に対してDRであるかどうかは分かりますか? –
@Kerrekいいえ、私はそのようなことがどのように決定されるかわからない。 – Barry