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!