Maison > développement back-end > C++ > Comment puis-je accéder aux variables héritées protégées dans les classes parents modèles en C ?

Comment puis-je accéder aux variables héritées protégées dans les classes parents modèles en C ?

Patricia Arquette
Libérer: 2024-12-10 07:56:12
original
442 Les gens l'ont consulté

How Can I Access Protected Inherited Variables in Templated Parent Classes in C  ?

Accès aux variables protégées héritées dans les classes parents basées sur un modèle

Le problème survient lors de la tentative d'accès aux variables héritées protégées à partir de classes parents basées sur un modèle en C . Considérez le code C suivant :

template<class T> class Foo {
    protected:
        int a;
};

template<class T> class Bar : public Foo<T> {
    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
}
Copier après la connexion

Dans ce cas, les versions 3.4.6 et plus récentes de GCC génèrent une erreur lors de la tentative d'accès à la variable protégée a de la classe Foo héritée. Les compilateurs plus anciens, notamment GCC 2.96 et MSVC 6-9, autorisent cet accès sans problème.

Explication de l'erreur

L'erreur se produit car, selon la norme C, non qualifié les noms dans les modèles doivent être recherchés lors de la définition du modèle. Cependant, la définition d'une classe de base dépendante (telle que Foo dans ce cas) peut ne pas être connue au moment de la définition du modèle. Cette incertitude empêche la résolution des noms non qualifiés.

Conformité à la norme

Le comportement présenté par GCC 3.4.6 et les versions ultérieures est conforme à la norme C. En adhérant à la norme, ces compilateurs garantissent que l'exactitude et le comportement du code sont cohérents sur les différentes plates-formes et compilateurs.

Résolution

Pour résoudre ce problème et accéder à l'héritage protégé variable, on peut soit utiliser le nom qualifié de la variable (par exemple, Foo::a) ou utiliser une déclaration "using". Par exemple :

template<class T>
int Bar<T>::Perna(int u) {
    int c = this->a * 4; // Access using the qualified name
    c = a * 4;          // Access using the "using" declaration
}
Copier après la connexion

Dans ce code modifié, le nom qualifié ou la déclaration "using" spécifie explicitement la source de la variable a, permettant au compilateur de la résoudre correctement.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal