Heim > Backend-Entwicklung > C++ > Wie kann ich in C auf geerbte geschützte Variablen einer übergeordneten Klasse mit Vorlagen zugreifen?

Wie kann ich in C auf geerbte geschützte Variablen einer übergeordneten Klasse mit Vorlagen zugreifen?

Patricia Arquette
Freigeben: 2024-11-30 05:30:10
Original
959 Leute haben es durchsucht

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

Zugriff auf geerbte Variablen aus der übergeordneten Klasse mit Vorlagen

In diesem Codeausschnitt:

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
}
Nach dem Login kopieren

neuere Versionen des GNU C-Compilers (z. B. 3.4 .6 und 4.3.2) berichten an Fehler:

error: `a' was not declared in this scope
Nach dem Login kopieren

beim Zugriff auf die geschützte Variable a der Basisklasse Foo innerhalb der Bar-Spezialisierung.

Standardkonformität

Die neueren GCC-Versionen folgen dem C-Standard, Dies gibt an, dass nicht qualifizierte Namen in einer Vorlage nicht abhängig sind und während der Vorlagendefinition aufgelöst werden müssen. Da die Definition einer abhängigen Basisklasse zu diesem Zeitpunkt möglicherweise nicht bekannt ist, können nicht qualifizierte Namen nicht aufgelöst werden.

Begründung

Durch das Verhindern des Zugriffs nicht qualifizierter geerbter Mitglieder in abhängigen Basisklassen wird sichergestellt, dass die Vorlage ist klar definiert und unabhängig von seiner Spezialisierung. Dadurch wird sichergestellt, dass die Semantik der Vorlage für verschiedene Spezialisierungen konsistent bleibt.

Auflösungen

Um auf die geerbte Variable in Bar zuzugreifen, können Sie qualifizierte Namen verwenden:

template<class T> 
int Bar<T>::Perna(int u) 
{ 
  int c = Foo<T>::a * 4; 
  return (Foo<T>::a + b) * u;
}
Nach dem Login kopieren

Alternativ können Sie eine using-Deklaration verwenden:

template<class T> 
int Bar<T>::Perna(int u) 
{ 
  using Foo<T>::a;
  int c = a * 4;
  return (a + b) * u;
}
Nach dem Login kopieren

Diese Syntax informiert den Compiler darüber, dass a im Gültigkeitsbereich vorhanden ist of Bar bezieht sich auf die Variable a der Foo-Basisklasse.

Das obige ist der detaillierte Inhalt vonWie kann ich in C auf geerbte geschützte Variablen einer übergeordneten Klasse mit Vorlagen zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage