Zugriff auf geerbte Variablen aus übergeordneten Vorlagenklassen
Als Antwort auf die Anfrage zur Variablenzugänglichkeit in übergeordneten Vorlagenklassen ist es unbedingt erforderlich, dies zu klären Moderne GNU-C-Compiler ab Version 3.4.6 halten sich strikt an den C-Standard. Es schreibt vor, dass unqualifizierte Namen in Vorlagen ausnahmslos unabhängig sind. Folglich wird das Auflösen dieser Namen zum Zeitpunkt der Vorlagendefinition aufgrund der unbekannten Natur abhängiger Basisklassenspezialisierungen, wie im bereitgestellten 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 }
Dieses Verhalten ist auf die Anforderung zurückzuführen, nicht qualifizierte Namen zu identifizieren Vorlagendefinition, die aufgrund möglicher zukünftiger Spezialisierungen für abhängige Basisklassen nicht möglich ist. Daher führen Versuche, innerhalb der „Perna“-Methode von „Bar“ unqualifiziert auf die geschützte Variable „a“ zuzugreifen, zu Fehlern.
Um diese Einschränkung zu umgehen, ist es notwendig, den qualifizierten Namen „Foo Darüber hinaus unterliegen auch in der Basisklasse deklarierte unqualifizierte Funktionsnamen dieser Einschränkung. Um auf solche Funktionen zuzugreifen, muss man entweder qualifizierte Namen verwenden oder eine „using“-Deklaration bereitstellen. Das obige ist der detaillierte Inhalt vonWie kann ich auf geerbte Variablen von übergeordneten Vorlagenklassen in C zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!using Foo<T>::a;
int c = a * 4; // Now valid