Вложенность шаблона специализации в зависимости от параметров шаблона - PullRequest
2 голосов
/ 15 января 2012
template < int ...Indices>

class T1 {
    template <int _1, int _2>
    class T2;
};

template <int ...Indices>
template <int _1>
class T1<Indices...>::T2<_1, sizeof...(Indices)> {};
//^--error: non-type template argument depends on a template parameter of the partial specialization

компилируется на gcc 4.5+, но ни на clang 3.1, ни на icc, оба жалуются на использование sizeof...(Indices). Это просто еще не реализованная функция в последних компиляторах или какой-то особый случай?

Спасибо

Buote

Ответы [ 2 ]

1 голос
/ 06 мая 2012

В параграфе 8 [temp.class.spec] стандарт гласит, что

В списке аргументов частичной специализации шаблона класса применяются следующие ограничения:
- Частично специализированный неВыражение аргумента типа не должно включать параметр шаблона частичной специализации, кроме случаев, когда выражение аргумента является простым идентификатором.[ Пример:

    template <int I, int J> struct A {};
    template <int I> struct A<I+5, I*2> {};  // error<br>
    template <int I, int J> struct B {};
    template <int I> struct B<I, I> {};      // OK
-
конец примера ]

Цель правила состоит в том, чтобы запретить частичные специализации на основе нетривиальных выражений, подобных тем, что впример, и sizeof...(Indices) - это , а не простой идентификатор, поэтому, возможно, Clang и ICC правы, чтобы отклонить его.Я не уверен, какой компилятор прав, если честно.Я предлагаю сообщить об ошибке одному из компиляторов, и если они скажут, что их реализация верна, сообщите об этом другим для интерпретации по-другому!

0 голосов
/ 17 января 2012

Вы можете попытаться попробовать:

template < int ...Indices>
class T1 
{
    static const int index_size = sizeof...(Indices);

    template <int _1, int _2>
    class T2;
};

template <int ...Indices>
template <int _1>
class T1<Indices...>::T2<_1, T1<Indices...>::index_size> {};

и посмотреть, связана ли проблема с компилятором с действительным оператором sizeof... или со способом, которым он используется в объявлении шаблона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...