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.