Heim >Backend-Entwicklung >C++ >Warum kann ich mit GCC nicht auf Basisklassenmitglieder in einer von einer Vorlage abgeleiteten Klasse zugreifen?

Warum kann ich mit GCC nicht auf Basisklassenmitglieder in einer von einer Vorlage abgeleiteten Klasse zugreifen?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-02 16:08:021046Durchsuche

Why Can't I Access Base Class Members in a Template-Derived Class with GCC?

GCC-Kompilierungsfehler: Zugriff auf Basisklassenmitglied abhängig vom Vorlagenargument

In C wird beim Erben von einer Vorlagenklasse der Zugriff auf Mitglieder der Basisklasse innerhalb der abgeleiteten Klasse kann manchmal eine Herausforderung darstellen, wie dieser Benutzer erlebt hat. Es wird ein Codeausschnitt bereitgestellt:

<code class="cpp">template <typename T> class A {
public:
    T foo;
};

template <typename T> class B: public A<T> {
public:
    void bar() { cout << foo << endl; }
};</code>

Beim Kompilieren dieses Codes mit GCC stößt der Benutzer auf den Fehler:

error: ‘foo’ was not declared in this scope

Das problematische Mitglied „foo“ sollte jedoch innerhalb von zugänglich sein abgeleitete Klasse.

Das Problem ergibt sich aus der Tatsache, dass der Compiler in C 11 und höher nicht mehr automatisch die Variablentypen in verschachtelten Vorlagen ableiten darf. Diese Einschränkung verhindert, dass der Compiler beim Kompilieren der abgeleiteten Klasse auf die Existenz des „foo“-Mitglieds in der Basisklasse schließt.

Um das Problem zu beheben, kann auf das Mitglied explizit über den Basisklassennamen zugegriffen werden:

<code class="cpp">void bar() { cout << A<T>::foo << endl; }

Alternativ kann der Zeiger „this“ verwendet werden:

<code class="cpp">void bar() { cout << this->foo << endl; }</code>

Diese Lösungen geben explizit an, dass das Mitglied „foo“ zur Basisklasse gehört, und stellen so sicher, dass der Compiler es korrekt identifizieren kann und klären Sie die Verwendung.

Das obige ist der detaillierte Inhalt vonWarum kann ich mit GCC nicht auf Basisklassenmitglieder in einer von einer Vorlage abgeleiteten Klasse 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