В VC ++ 10 следующий пример завершается ошибкой C2027: «использование неопределенного типа 'X'». Однако g ++ 4.6 прекрасно его компилирует.
template<class T>
class C
{
static const size_t size = sizeof(T);
};
class X : public C<X> { };
Так какой из них правильный? И как мне сделать это, чтобы он работал на основных компиляторах?
Это не так уж важно, потому что VC ++ по-прежнему позволяет sizeof (T) внутри функций-членов C. Мне просто нужно повторить несколько длинных определений типов, что меня раздражает .
РЕДАКТИРОВАТЬ: Я понимаю, что мой пример был плохим, потому что я действительно хотел использовать размер в качестве постоянной времени компиляции следующим образом:
template<size_t size> class C2 { };
template<class T>
class C
{
typedef C2<sizeof(T)> A;
};
class X : public C<X> { };
Оба компилятора отвергают это, поэтому я предполагаю, что это, вероятно, невозможно, но, как я уже сказал, я все еще могу используйте sizeof внутри функций. Я просто надеялся, что мне не придется повторять typedef внутри каждой функции.
template<size_t size> class C2 { };
template<class T>
class C
{
void foo() { typedef C2<sizeof(T)> A; }
};
class X : public C<X> { };