GCC a raison, cela est explicitement interdit par 11 C++ [temp.class.spec] §8:
8 Within the argument list of a class template partial specialization, the following restrictions apply:
A partially specialized non-type argument expression shall not involve a template parameter of the partial specialization except when the argument expression is a simple identifier. [ Example:
template <int I, int J> struct A {};
template <int I> struct A<I+5, I*2> {}; // error
template <int I, int J> struct B {};
template <int I> struct B<I, I> {}; // OK
—end example ]
The type of a template parameter corresponding to a specialized non-type argument shall not be dependent on a parameter of the specialization. [ Example:
template <class T, T t> struct C {};
template <class T> struct C<T, 1>; // error
template< int X, int (*array_ptr)[X] > class A {};
int array[5];
template< int X > class A<X,&array> { }; // error
—end example ]
...
Je crois que le point 2 est le plus pertinent ici.
En ce qui concerne la question de "comment résoudre ce problème." Dans la forme la question est maintenant, il n'y a pas de solution de rechange, j'ai peur.
Quant à la vesion originale de faire des séquences entières, je crois que vous pourriez le faire fonctionner avec l'utilisation uintmax_t
pour le type de paramètre de modèle non-type et ne le convertir en intT
dans la définition finale.
Comment résoudre ce problème? -> voir les réponses aux questions suivantes pour certaines solutions de contournement: [(Partiellement)) spécialisation d'un paramètre de modèle non-type de type dépendant] (http://stackoverflow.com/questions/22486386/partially-specializing-a-non-type -template-parameter-of-dependent-type/22486607 # 22486607) et [Paramètre de modèle non-type dépendant et modèle variadique] (http://stackoverflow.com/questions/23228894/dependant-non-type-template-parameter- et-variadic-template? lq = 1). – Constructor