我正在开发一个大型项目,其中包含一段可编译的代码 - 但我不明白如何。我把它提炼成这个简单的例子:
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 上都可以正常编译。(A)
但是,如果我翻转标记和的两行的顺序,则代码无法编译,(B)
抱怨typedef
.Second
为什么这段代码会编译,为什么typedef
和成员变量的顺序很重要?