En C, lors de la définition d'un modèle de classe, la portée de la classe de base n'est pas examinée lors de la recherche de nom non qualifié si le la classe de base dépend d'un paramètre de modèle. Ce comportement est décrit dans 14.6.2/3 de la norme C.
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; // fails - Vec_t is not recognized };
Dans cet exemple, la classe B hérite du modèle de classe A, qui contient un alias de type Vec_t. Cependant, au sein de la classe B, tenter d'utiliser Vec_t sans le qualifier complètement (c'est-à-dire A
Pour résoudre ce problème, le nom de l'alias de type doit être pleinement qualifié au sein de la classe B :
template<typename T> class B : public A<T> { private: typename A<T>::Vec_t v; // correct - fully qualified name };
En effet, lors du nom non qualifié Lors d'une recherche dans la définition d'un modèle de classe ou de son membre, la portée de la classe de base n'est pas examinée si la classe de base dépend d'un paramètre de modèle. Il est donc nécessaire de qualifier explicitement le nom de l'alias de type pour éviter les erreurs du compilateur.
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!