Maison > Article > développement back-end > Pourquoi GCC renvoie-t-il une erreur « Non déclaré » lors de l'accès aux membres de la classe de base dans un modèle ?
Piège GCC : accès aux membres de la classe de base avec dépendance d'argument de modèle
Ce code présente une erreur de compilation déroutante dans GCC mais réussit dans Visual Studio :
template <typename T> class A { public: T foo; }; template <typename T> class B: public A<T> { public: void bar() { cout << foo << endl; } };
GCC génère une erreur : "foo' n'a pas été déclaré dans cette portée", bien qu'il soit membre de la classe de base. Cependant, modifier le code pour référencer explicitement le membre de la classe de base via "this->foo" résout le problème.
Explication
GCC suit la norme C, qui interdit l'inférence des membres de la classe de base lors de la compilation du modèle. Dans les versions antérieures, GCC déduisait les membres en analysant la classe de base, mais cela pouvait entraîner des conflits.
Pour résoudre ce problème, garantissez un accès explicite aux membres de la classe de base dans les modèles :
Utilisez "this" pour référencer le membre :
void bar() { cout << this->foo << endl; }
Spécifiez le nom de la classe de base :
void bar() { cout << A<T>::foo << endl; }
En adhérant à Grâce à ces directives, les développeurs peuvent éviter les erreurs de compilation et garantir que GCC gère l'accès aux membres de la classe de base comme prévu dans les modèles. Plus de détails sont disponibles dans le manuel GCC.
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!