Typedefs de modèles pour les classes dérivées
En C, les modèles permettent de définir des classes génériques et des structures de données. Cependant, la propagation des typedefs de la base vers les classes dérivées nécessite une manipulation spécifique.
Considérez le code suivant :
template<typename T> class A { public: typedef std::vector<T> Vec_t; }; template<typename T> class B : public A<T> { private: Vec_t v; // Error: Vec_t is not recognized };
Dans cet exemple, la classe A définit une typedef pour un vecteur de type T. Cependant , lorsque vous essayez d'utiliser ce typedef dans la classe dérivée B, une erreur se produit car Vec_t n'est pas reconnu dans la portée de B.
La raison car ce problème découle du traitement par la norme C de la portée de la classe de base pour les modèles. Selon la section 14.6.2/3 de la norme :
"Dans la définition d'un modèle de classe ou d'un membre d'un modèle de classe, si une classe de base du modèle de classe dépend d'un paramètre de modèle, le la portée de la classe de base n'est pas examinée lors de la recherche de nom non qualifié..."
Cela signifie que les typedefs définis dans la classe de base ne sont pas automatiquement disponibles dans la portée de la classe dérivée lors de l'utilisation de noms non qualifiés. Pour résoudre ce problème, le typedef doit être pleinement qualifié :
typename A<T>::Vec_t v;
En utilisant le mot-clé typename suivi du nom complet du typedef, vous spécifiez explicitement que vous souhaitez utiliser le typedef de la classe de base. . Cela fonctionnera comme prévu et vous permettra d'accéder au typedef vectoriel dans la classe dérivée.
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!