Вы немного несправедливы по отношению к компилятору здесь - C
неполон без B<C>
полностью известного и при обработке B<C>
, C
все еще не завершенный тип. Есть похожие темы на comp.lang.c ++. Moderated и comp.lang.c ++ .
Обратите внимание, что это работает, если вы задержите использование, переместив его в определение функции-члена, например ::
struct C : B<C> {
void f() { typedef typename C::Asub Asub; }
};
Вы можете обойти эту проблему, передавая типы явно вверх:
template<class T, class Asub> struct B { /* ... */ };
class C : B<C, int> { /* ... */ };
... или переместив их в какой-нибудь класс черт, если вам нужно пройти больше:
template<class T, class Traits> struct B {
void DoSomething(typename Traits::Asub it) {}
};
struct CTraits {
typedef int Asub;
};
struct C : B<C, CTraits> {
typedef CTraits::Asub Asub;
};