Eingeschränkte Sichtbarkeit von Bezeichnern in abgeleiteten Vorlagenklassen
In C führen Vorlagenklassen einen einzigartigen Aspekt bei der Vererbung ein: Bezeichner, die in einer Basisvorlagenklasse definiert sind ist für abgeleitete Vorlagenklassen möglicherweise nicht sichtbar. Dieses Verhalten, das als zweiphasige Suche bezeichnet wird, entsteht aufgrund der unterschiedlichen Phasen bei der Instanziierung und Kompilierung von Vorlagen.
Betrachten Sie das folgende Beispiel:
template <typename T> class Base { public: static const bool ZEROFILL = true; static const bool NO_ZEROFILL = false; }; template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = NO_ZEROFILL); // NO_ZEROFILL is not visible ~Derived(); };
Beim Kompilieren dieses Codes verwendet GCC g 3.4.4 (cygwin) erzeugt einen Fehler, da Derived von seiner Basisklasse Base aus nicht auf NO_ZEROFILL zugreifen kann. Dies liegt daran, dass der Compiler in der ersten Phase der Vorlageninstanziierung, wenn er den Code analysiert, T keinen konkreten Typ zugewiesen hat. Daher kann er die spezifische Basisklasse, von der Derived erbt, nicht ermitteln und definierte Bezeichner daher nicht auflösen innerhalb der Basisklasse.
Um diese Einschränkung zu überwinden, ist beim Zugriff auf Basisklassenbezeichner in abgeleiteten Vorlagenklassen eine explizite Qualifizierung erforderlich. Der folgende Code behebt das Problem:
template <typename T> class Derived : public Base<T> { public: Derived(bool initZero = Base<T>::NO_ZEROFILL); // Explicit qualification ~Derived(); };
Durch die Verwendung von Base
Daher kann in abgeleiteten Vorlagenklassen auf Bezeichner, die in Basisvorlagenklassen definiert sind, nur mit expliziter Qualifikation zugegriffen werden, wodurch eine korrekte Auflösung zur Laufzeit sichergestellt wird, wenn die Vorlage vorhanden ist mit bestimmten Typen instanziiert.
Das obige ist der detaillierte Inhalt vonWarum kann in abgeleiteten Vorlagenklassen in C nicht auf Basisklassenbezeichner zugegriffen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!