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 }
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
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 }
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!