Maison >développement back-end >C++ >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 ?

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 ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-02 11:15:02608parcourir

Why Does GCC Throw a

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 un 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 la classe de base name :

    void bar() { cout << A<T>::foo << endl; }

En adhérant à 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!

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