Проблемы с C ++ CRTP, ошибка MSVC C2039 - PullRequest
4 голосов
/ 21 мая 2009

MSVC 2008 не скомпилирует этот код:

template <class Derived>
struct B
{
   typename Derived::type t;
};

struct D : B<D>
{
   typedef int type;
};

void main()
{
   D d;
}

Я получаю ошибку «ошибка C2039:« тип »: не является членом« D »» ». Есть идеи?

Ответы [ 2 ]

7 голосов
/ 21 мая 2009

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

5 голосов
/ 21 мая 2009

g ++ дает более полезные сообщения об ошибках:

g ++ -c -o /tmp/t.o /tmp/t.cpp
/tmp/t.cpp: в экземпляре «B»:
/tmp/t.cpp:8: создается здесь
/tmp/t.cpp:4: ошибка: недопустимое использование неполного типа ‘struct D’
/tmp/t.cpp:7: ошибка: предварительное объявление ‘struct D’
/tmp/t.cpp:12: ошибка: «:: main» должен возвращать «int»

...