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 ?

Comment puis-je accéder aux variables protégées héritées d'une classe parent modèle en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-30 05:30:10960parcourir

How Can I Access Inherited Protected Variables from a Templated Parent Class in C  ?

Accès à la variable héritée de la classe parent modèle

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.

Conformité standard

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.

Justification

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.

Résolutions

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!

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