Bonjour,
Dans l'un de ses livres, Scott Meyers nous parle de la signification du mot clé typename (itme 42). Il nous dit que typename permet de préciser au compilateur la présence d'un type dépendant d'un template, afin que le compilateur ne le confonde pas avec une variable locale.
Il donne alors l'exemple suivant:
1 2 3 4 5 6 7 8 9 10
| template<typename C>
void print2nd(const C& container) // container;
{ // this is not valid C++!
if (container.size() >= 2) {
C::const_iterator iter(container.begin()); // get iterator to 1st element
++iter; // move iter to 2nd element
int value = *iter; // copy that element to an int
std::cout << value; // print the int
}
} |
Ici, le type dépendant (de C ) est bien sûr const_iterator.
Il semble évident que C::const_iterator soit un type "iterator", et que donc que iter soit un iterator.
Mais cela est évident pour le lecteur, pas pour le compilateur. (en effet, cela pourrait très bien être une variable statique de la classe C).
Le problème est qu'au moment de la compilation, C n'est pas connu, et il n'y a aucun moyen de savoir si oui ou non C possède bien un type "const_iterator".
De ce fait, il est nécessaire de mettre le mot clé typename devant C::const_iterator.
Cependant, je viens d'essayer avec VC2010,et le compilateur accepte parfaitement le code ci-dessus. Il ne renvoie pas d'erreur, qu'il y ait typename ou non.
Alors la question que je me pose est la suivante:
Au moment ou Scott Meyers à écrit ce livre, les compilateurs présentaient encore de ce genre de problèmes, mais maintenant, il est possible que les compilateurs savent parfaitement résoudre ce genre d'ambiguïté.
Merci.
Partager