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 }
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
beim Zugriff auf die geschützte Variable a der Basisklasse Foo innerhalb der Bar-Spezialisierung.
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.
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.
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; }
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; }
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!