MSVC 2008 不会编译此代码:
template <class Derived>
struct B
{
typename Derived::type t;
};
struct D : B<D>
{
typedef int type;
};
void main()
{
D d;
}
我得到的错误是“错误C2039:'type':不是'D'的成员”。有任何想法吗?
因为 B 需要 D 的完整类型定义才能自己定义。
您可能期望的内容如下:
template <class Derived>
struct B
{
B() {
typename Derived::type t;
}
};
struct D : B<D>
{
typedef int type;
};
void main()
{
D d;
}
这是有效的,因为在实例化 D()(以及因此 B())时,编译器具有类型的完整定义。
g++ 给出了更多有用的错误信息:
g++ -c -o /tmp/to /tmp/t.cpp
/tmp/t.cpp: 在'B'的实例化中:
/tmp/t.cpp:8: 从这里实例化
/tmp/t.cpp:4:错误:无效使用不完整类型“struct D”<br>/tmp/t.cpp:7:错误:“struct D”前向声明<br>/tmp/t.cpp:12:错误:'::main ' 必须返回 'int'