2

Я борюсь с шаблонами! Рассмотрим следующий код:Недопустимый аргумент шаблона

template <typename... Ts> struct Sequence {}; 

template<unsigned N> struct B { 
    template<unsigned P> struct C { 
    typedef int type; 
    }; 
}; 

Тогда это совершенно правильно:

template<unsigned... Is> 
struct Loop2 { 
    typedef Sequence< typename B<5>::C<Is>::type... > type; 
}; 

Loop2<3,1> l; 

Поэтому я не могу понять, почему это шаблонный вариант:

template<unsigned N, unsigned... Is> 
struct Loop3 { 
    typedef Sequence< typename B<N>::C<Is>::type... > type; 
}; 

не принимается компилятором , Это поднимет следующее сообщение об ошибке:

essai.cpp:29:51: error: template argument 1 is invalid 
    typedef Sequence< typename B<N>::C<Is>::type... > type; 

Для информации, которую я получил это с

g++ (SUSE Linux) 4.8.1 20130909 [gcc-4_8-branch revision 202388] 

Спасибо за любую помощь!

Кстати: любое предложение для лучшего названия приветствуется!

+0

* "Поэтому я могу «Не понимаю, почему эта шаблонная версия [..] не принимается компилятором» * Поскольку может существовать шаблон <> struct B <4> {int C; }; ', то есть, что' C' является шаблоном, не является очевидным для компилятора без конкретной специализации 'B'. – dyp

ответ

4

Как B не конкретный типа больше, вам нужно флаг C с template ключевым словом, как это depenend на значении N. Используя follwing код должен работать:

template<unsigned N, unsigned... Is> 
struct Loop3 { 
    typedef Sequence< typename B<N>::template C<Is>::type... > type; 
}; 
+0

Вы, кажется, правы, но я не понимаю, что вы подразумеваете под «B больше не является конкретным типом». Можете ли вы уточнить или указать ссылку? – hivert

+0

С B <5> в Loop2 мы создали экземпляр типа из шаблона, то есть компилятору задан определенный тип, тогда как в ситуации B у нас все еще есть шаблон, который зависит от того, как N будет выбрано «некоторое время спустя» и может варьироваться между режимами Loop3. – xhochy

+0

@hivert: указано иначе: поскольку 'B ' зависит от аргументов шаблона, вам нужно квалифицировать любой вложенный класс/шаблон с ключевыми словами 'typename' /' template' –

Смежные вопросы