Maison >développement back-end >C++ >Quand le mot-clé « typename » est-il requis dans les modèles C ?

Quand le mot-clé « typename » est-il requis dans les modèles C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-21 01:03:10641parcourir

When is the

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é :

  • " typename": spécifie un type dans un modèle
  • "template": spécifie un modèle dans un template
  • "value" : spécifie une valeur dans un modèle (non explicitement affichée dans l'exemple)

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 :

  • Lors de la déclaration d'un alias de modèle dans une classe
  • Lors de la définition d'un constructeur ou d'un destructeur pour un type imbriqué
  • Lors de l'accès à une fonction membre d'un type imbriqué
  • Lors de l'utilisation d'un type comme argument de modèle

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn