4

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'的成员”。有任何想法吗?

4

2 回答 2

7

因为 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())时,编译器具有类型的完整定义。

于 2009-05-21T03:19:54.970 回答
5

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'

于 2009-05-21T03:13:38.803 回答