Il existe une notion de dépendance et de non indépendant dans le cas de modèles.
Si le nom dépend du paramètre de modèle T, son dépendante et d'autres qui ne dépendent pas du paramètre T sont indépendant noms.
Voici la règle : le compilateur ne fait pas de regarde pas dans les classes de base dépendantes (comme A) lorsqu'il recherche des noms non dépendants (comme Vec_t). En conséquence, le compilateur n'a pas besoin de chercher dans les classes de base dépendantes (comme A), le compilateur ne sait même pas qu'elles encore moins qu'il s'agit de types.
Le compilateur ne peut pas supposer que Vec_t
est un type jusqu'à ce qu'il sache que T
parce qu'il existe une spécialisation potentielle des A<T>
où A<T>:: Vec_t
est un est un membre des données
La solution est donc d'utiliser typename
typename A<T>::Vec_t v; ← good
Je vous recommande de lire ce qui suit https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-types .
Ancien lien (cassé) : http://www.parashift.com/c++-faq-lite/templates.html#faq-35.18
0 votes
Double exact : stackoverflow.com/questions/1567730/
12 votes
En fait, il ne s'agit pas vraiment d'une copie exacte puisque l'article que vous mentionnez parle d'une méthode alors que celui-ci parle d'un type.
2 votes
Typename A::Vec_t v ; est parfait. Pas besoin de <T> ici