Zugriff auf geerbte geschützte Variablen in übergeordneten Klassen mit Vorlagen
Das Problem tritt auf, wenn versucht wird, auf geschützte geerbte Variablen aus übergeordneten Klassen mit Vorlagen in C zuzugreifen. Betrachten Sie den folgenden C-Code:
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 }
In diesem Fall lösen GCC-Versionen 3.4.6 und höher einen Fehler aus, wenn sie versuchen, auf die geschützte Variable a der geerbten Foo-Klasse zuzugreifen. Ältere Compiler, einschließlich GCC 2.96 und MSVC 6-9, ermöglichen diesen Zugriff ohne Probleme.
Fehlererklärung
Der Fehler tritt auf, weil er gemäß C-Standard unqualifiziert ist Namen in Vorlagen müssen während der Vorlagendefinition nachgeschlagen werden. Allerdings ist die Definition einer abhängigen Basisklasse (wie in diesem Fall Foo) zum Zeitpunkt der Vorlagendefinition möglicherweise nicht bekannt. Diese Unsicherheit verhindert die Auflösung nicht qualifizierter Namen.
Standardkonformität
Das Verhalten von GCC 3.4.6 und späteren Versionen entspricht dem C-Standard. Durch die Einhaltung des Standards stellen diese Compiler sicher, dass die Codekorrektheit und das Verhalten auf verschiedenen Plattformen und Compilern konsistent sind.
Lösung
Um dieses Problem zu beheben und auf das geschützte Erbe zuzugreifen Variable kann man entweder den qualifizierten Namen der Variablen verwenden (z. B. 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 }
In diesem geänderten Code gibt der qualifizierte Name oder die „using“-Deklaration explizit die Quelle einer Variablen an, sodass der Compiler sie korrekt auflösen kann.
Das obige ist der detaillierte Inhalt vonWie kann ich in C auf geschützte geerbte Variablen in übergeordneten Vorlagenklassen zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!