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