Поскольку 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 ()) компилятор имеет полное определение типа.