Следующий код не компилирует. Я получаю сообщение об ошибке: ошибка C2039: 'Атомная подлодка': не член 'C'
Кто-то может помочь мне понять это?
Попробованный VS2008 и компилятор 2010 года.
template <class T>
class B
{
typedef int Asub;
public:
void DoSomething(typename T::Asub it)
{
}
};
class C : public B<C>
{
public:
typedef int Asub;
};
class A
{
public:
typedef int Asub;
};
int _tmain(int argc, _TCHAR* argv[])
{
C theThing;
theThing.DoSomething(C::Asub());
return 0;
}
Здесь вы немного несправедливо по отношению к компилятору - C
неполный, если B
полностью не известен и при обработке B
, 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;
};