2

Mon compilateur est gcc 4.9.0. Le code suivant ne peut pas être compilé:Pourquoi gcc se plaint "error: le type 'intT' de l'argument template '0' dépend d'un paramètre template"?

template<typename T, T i> 
struct value {}; 

template<typename T> 
struct value<T, 0> {}; 
// error: type 'T' of template argument '0' depends on a template parameter 

Quelle est la cause? et, comment résoudre ce problème?

+0

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

Répondre

7

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.

+0

Où est la solution? – xmllmx

+1

@ Angew: Bonté, je me suis battu et c'était vraiment têtu ... content que vous l'ayez réussi! –

+0

@xmllmx Vous avez demandé pourquoi cela ne fonctionne pas, pas comment le faire fonctionner. La version abrégée de votre question a une réponse simple "cela ne peut pas fonctionner." L'original pourrait avoir une solution différente, cependant. Pourtant, la question était "pourquoi?" – Angew

Questions connexes