Как получить размер аргумента шаблона при использовании CRTP?

В 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> { };
7
задан Timo 17 December 2011 в 13:07
поделиться