Quand le mot-clé « typename » est-il requis ? [duplicata]
Considérez le code suivant :
template<class K> class C { struct P {}; vector<P> vec; void f(); }; template<class K> void C<K>::f() { typename vector<P>::iterator p = vec.begin(); }
Pourquoi le mot-clé "typename" est-il nécessaire dans cet exemple ?
Réponse :
Le mot-clé "typename" est nécessaire chaque fois que vous faites référence à un nom imbriqué dans une classe ou une fonction de modèle où le type du nom imbriqué n'est pas connu au moment de la compilation. C'est ce qu'on appelle un « nom dépendant ».
En C , il existe trois catégories d'entités : les valeurs, les types et les modèles. Chacun d’entre eux peut avoir un nom, mais le nom lui-même n’indique pas à quelle catégorie appartient l’entité. Par conséquent, le compilateur doit déduire la catégorie d'entité à partir du contexte.
Lorsque le compilateur ne peut pas déduire la catégorie, vous devez la spécifier explicitement à l'aide du mot-clé approprié :
Dans le code fourni, le nom imbriqué "vector< ;P>" est un type dans une classe de modèle. Toutefois, le compilateur ne peut pas en déduire car le paramètre de type « K » est inconnu au moment de la compilation. Par conséquent, le mot-clé « typename » est requis pour spécifier explicitement que « vector
» est un type.
D'autres cas où "typename" doit être spécifié incluent :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!