GCC-Falle: Zugriff auf Basisklassenmitglieder mit Abhängigkeit von Vorlagenargumenten
Dieser Code weist einen rätselhaften Kompilierungsfehler in GCC auf, funktioniert aber in Visual Studio:
template <typename T> class A { public: T foo; }; template <typename T> class B: public A<T> { public: void bar() { cout << foo << endl; } };
GCC löst einen Fehler aus: „foo‘ wurde in diesem Bereich nicht deklariert“, obwohl es Mitglied der Basisklasse ist. Das Problem wird jedoch behoben, indem der Code so geändert wird, dass er explizit über „this->foo“ auf das Basisklassenmitglied verweist.
Erklärung
GCC folgt dem C-Standard, der verbietet die Schlussfolgerung von Basisklassenmitgliedern während der Vorlagenkompilierung. In früheren Versionen leitete GCC Mitglieder durch Parsen der Basisklasse ab, was jedoch zu Konflikten führen konnte.
Um dieses Problem zu beheben, stellen Sie expliziten Zugriff auf Basisklassenmitglieder in Vorlagen sicher:
Verwenden Sie „this“, um auf das Mitglied zu verweisen:
void bar() { cout << this->foo << endl; }
Geben Sie den Namen der Basisklasse an:
void bar() { cout << A<T>::foo << endl; }
Durch Einhaltung Mithilfe dieser Richtlinien können Entwickler Kompilierungsfehler verhindern und sicherstellen, dass GCC den Zugriff auf Basisklassenmitglieder wie in den Vorlagen vorgesehen handhabt. Weitere Details finden Sie im GCC-Handbuch.
Das obige ist der detaillierte Inhalt vonWarum gibt GCC beim Zugriff auf Basisklassenmitglieder in einer Vorlage einen Fehler „Nicht deklariert' aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!