Variable template dans une class template

Comportement étrange à l'instanciation

Le problème exposé dans ce sujet a été résolu.

EDIT : Problème réglé, j’aurais dû tester avec Clang avant de poser la question. Clang m’a donné un message beaucoup plus explicite, et en fait le comportement est tout à fait normal : il manque le mot-clé template pour expliciter au compilateur que value est une variable template :

return X<T>::template value<U>;

Salut les agrumes,

Lors de manipulations obscures je me suis rendu compte d’un comportement très étrange, que je vais illustrer avec le programme minimal suivant :

template<typename T>
struct X
{
    template<typename U>
    static constexpr auto value = 5;
};

template<typename T, typename U>
void foo()
{
    return X<T>::value<U>;
}

Eh bien ce code ne compile pas ! On a une erreur du lexer concernant la ligne 11 :

error: expected primary-expression before '>' token

J’étais très étonné de ce comportement, et visiblement il n’aime pas ce genre de construction dès lors que le type avec lequel on instancie le template X est lui-même un type générique. Voyez plutôt :

// Exemple précédent :
return X<T>::value<float>; // error: expected primary-expression before '>' token
// Second type non générique :
return X<T>::value<float>; // error: expected primary-expression before 'float'
// Premier type non générique :
return X<int>::value<float>;
return X<int>::value<U>; // OK !

Est-ce que quelqu’un a une explication à ce comportement étrange ? Je n’ai rien trouvé qui puisse l’expliquer en feuilletant la doc.

N.B : Je n’ai testé de compiler qu’avec gcc, j’essaierai au plus vite avec un autre compilateur au cas où c’est un bug du compilo.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte