Maison >développement back-end >C++ >Comment puis-je accéder aux variables protégées héritées d'une classe parent modèle en C ?
Dans cet extrait de code :
template<class T> class Foo { public: Foo() { a = 1; } protected: int a; }; template<class T> class Bar : public Foo<T> { public: Bar() { b = 4; }; int Perna(int u); protected: int b; }; template<class T> int Bar<T>::Perna(int u) { int c = Foo<T>::a * 4; // This works return (a + b) * u; // This doesn't }
versions plus récentes du compilateur GNU C (par exemple, 3.4 .6 et 4.3.2) signalent un erreur :
error: `a' was not declared in this scope
lors de l'accès à la variable protégée a de la classe de base Foo dans la spécialisation Bar.
Les versions les plus récentes de GCC suivent la norme C, qui spécifie que les noms non qualifiés dans un modèle ne sont pas dépendants et doivent être résolus lors de la définition du modèle. Étant donné que la définition d'une classe de base dépendante n'est peut-être pas connue pour le moment, les noms non qualifiés ne peuvent pas être résolus.
Empêcher l'accès des membres hérités non qualifiés dans les classes de base dépendantes garantit que le modèle est bien défini et indépendant de sa spécialisation. Cela garantit que la sémantique du modèle reste cohérente pour les différentes spécialisations.
Pour accéder à la variable héritée dans Bar, vous pouvez utiliser des noms qualifiés :
template<class T> int Bar<T>::Perna(int u) { int c = Foo<T>::a * 4; return (Foo<T>::a + b) * u; }
Alternativement, vous pouvez utiliser une déclaration using :
template<class T> int Bar<T>::Perna(int u) { using Foo<T>::a; int c = a * 4; return (a + b) * u; }
Cette syntaxe informe le compilateur que a dans la portée de Bar fait référence à la variable a de la classe de base Foo.
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!