Heim > Backend-Entwicklung > C++ > Warum kann in abgeleiteten Vorlagenklassen in C nicht auf Basisklassenbezeichner zugegriffen werden?

Warum kann in abgeleiteten Vorlagenklassen in C nicht auf Basisklassenbezeichner zugegriffen werden?

Linda Hamilton
Freigeben: 2024-11-19 00:10:02
Original
460 Leute haben es durchsucht

Why Are Base Class Identifiers Inaccessible in Derived Template Classes in C  ?

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();
};
Nach dem Login kopieren

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();
};
Nach dem Login kopieren

Durch die Verwendung von Base::NO_ZEROFILL wird der Compiler explizit angewiesen, in der Basisklasse nach dem Bezeichner zu suchen, auch wenn dies beim konkreten Typ von T nicht der Fall ist zu diesem Zeitpunkt bekannt.

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage