Accès aux variables héritées des classes parents basées sur un modèle
En réponse à la question concernant l'accessibilité des variables dans les classes parents basées sur un modèle, il est impératif de clarifier que les compilateurs GNU C modernes, à partir de la version 3.4.6, adhèrent strictement au standard C. Cela stipule que les noms non qualifiés dans les modèles sont invariablement indépendants. Par conséquent, la résolution de ces noms au moment de la définition du modèle devient irréalisable en raison de la nature inconnue des spécialisations de classes de base dépendantes, comme dans l'extrait de code fourni :
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 }
Ce comportement découle de l'obligation d'identifier les noms non qualifiés lors de la définition du modèle. définition de modèle, ce qui n'est pas possible pour les classes de base dépendantes en raison de potentielles spécialisations futures. Par conséquent, les tentatives d'accès à la variable protégée 'a' sans qualification dans la méthode 'Perna' de 'Bar' entraîneront des erreurs.
Pour contourner cette limitation, il est nécessaire d'utiliser le nom qualifié 'Foo De plus, les noms de fonctions non qualifiés déclarés dans la classe de base sont également soumis à cette restriction. Pour accéder à de telles fonctions, il faut soit utiliser des noms qualifiés, soit fournir une déclaration 'using'. 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!using Foo<T>::a;
int c = a * 4; // Now valid