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

Wie kann ich in C auf geschützte geerbte Variablen in übergeordneten Vorlagenklassen zugreifen?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-10 07:56:12414Durchsuche

How Can I Access Protected Inherited Variables in Templated Parent Classes in C  ?

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::a) oder eine „using“-Deklaration verwenden. Zum Beispiel:

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!

Stellungnahme:
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