шаблоны — реализация шаблонов C ++ и CRTP и дилемма компилятора

Я пытаюсь скомпилировать следующий фрагмент кода, однако есть проблема, которую я не могу решить:

template <int x>
struct count_x
{
enum { x_size = x };
};

template <typename y>
struct crtp_base
{
typedef typename y::count_t count_t;
crtp_base(const count_t&){}
};

template <int x>
struct derived : public crtp_base<derived<x> >
{
typedef typename count_x<x> count_t;
typedef crtp_base<derived<x> > base_t;
derived(const count_t& c) : base_t(c){}
};int main()
{
derived<2> d((count_x<2>()));
return 0;
}

При компиляции с wth clang 3.1 возникает следующая ошибка:

c:\clangllvm\code\example.cc:18:21: error: expected a qualified name after 'typename'
typedef typename count_x<x> count_t;
^
c:\clangllvm\code\example.cc:18:21: error: typedef name must be an identifier
typedef typename count_x<x> count_t;
^~~~~~~~~~
c:\clangllvm\code\example.cc:18:28: error: expected ';' at end of declaration list
typedef typename count_x<x> count_t;
^
;
c:\clangllvm\code\example.cc:20:18: error: no template named 'count_t'; did you mean 'count_x'?
derived(const count_t& c)
^~~~~~~
count_x
c:\clangllvm\code\example.cc:2:8: note: 'count_x' declared here
struct count_x
^
c:\clangllvm\code\example.cc:20:18: error: use of class template count_x requires template arguments
derived(const count_t& c)
^
c:\clangllvm\code\example.cc:2:8: note: template is declared here
struct count_x
^
5 errors generated.

Я полагаю, что это как-то связано с тем, как шаблоны определяются во время компиляции и определяются ли они как типы в нужное время. Я также попытался добавить «using base_t :: count_t;» безрезультатно. Кроме этого, диагностика, произведенная компилятором, действительно потеряла меня. Буду признателен за ответ или предложение о том, что почитать об этой ошибке.

6

Решение

count_x<x> не является квалифицированным именем (оно не имеет :: вообще!), поэтому ему не может предшествовать typename,

Как только вы исправите это, код все равно не будет работать, потому что вложенные typedefs производного типа еще не были видны компилятору, когда он создает базу CRTP. это другой вопрос показывает некоторые альтернативы.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]