Avoir (bug possible?):modèle variable en classe modèle - erreur inattendue
struct Value
{
template<class T>
static constexpr T value{0};
};
(0) ideone
template<typename TValue>
struct Something
{
void x()
{
static_assert(TValue::template value<int> == 0, "");
}
};
int main() { Something<Value>{}.x(); return 0; }
ne compile pas avec clang ++ 3.6.
error: cannot refer to variable template 'value' without a template argument list
Ne compile pas avec g ++ 5.2.
error: ‘template constexpr const T Value::value’ is not a function template
(1) ideone
Compile avec les deux clang ++ et g ++.
struct Something
{
void x()
{
static_assert(Value::template value<int> == 0, "");
}
};
int main() { Something{}.x(); return 0; }
Pourquoi (0) ne parviennent pas à compiler?
Il semble que le problème se produit si le modèle de variable est accessible via un paramètre de modèle (dans ce cas, TValue
). La définition d'un alias de type pour TValue
ou l'utilisation du mot-clé typename
ne résout pas le problème.
Que se passe-t-il ici?
Qu'est-ce que 'template statique constexpr T valeur {0};' supposé faire? Est-ce quelque chose de nouveau? Comment cela s'appelle-t-il? –
@ BЈовић, Il est appelé * modèle de variable *, ajouté en C++ 14. Voir [this] (https://en.wikipedia.org/wiki/C%2B%2B14#Variable_templates) (wiki) et [this] (http://fr.cppreference.com/w/cpp/language/variable_template) (cppreference) – Nawaz
(0) échoue pour moi sur clang 3.6, avec "ne peut pas se référer au modèle variable" 'value' 'sans une liste d'arguments modèle" – Barry