Vorlagentypdefinitionen für abgeleitete Klassen
In C ermöglichen Vorlagen die Definition generischer Klassen und Datenstrukturen. Die Weitergabe von Typedefs von der Basis an abgeleitete Klassen erfordert jedoch eine spezielle Handhabung.
Beachten Sie den folgenden Code:
template<typename T> class A { public: typedef std::vector<T> Vec_t; }; template<typename T> class B : public A<T> { private: Vec_t v; // Error: Vec_t is not recognized };
In diesem Beispiel definiert Klasse A eine Typedef für einen Vektor vom Typ T. Allerdings Beim Versuch, diese Typdefinition in der abgeleiteten Klasse B zu verwenden, tritt ein Fehler auf, da Vec_t nicht im Gültigkeitsbereich von B erkannt wird.
Der Grund Dieses Problem ergibt sich aus der Behandlung des Basisklassenbereichs für Vorlagen durch den C-Standard. Gemäß Abschnitt 14.6.2/3 des Standards:
"Wenn in der Definition einer Klassenvorlage oder eines Mitglieds einer Klassenvorlage eine Basisklasse der Klassenvorlage von einem Vorlagenparameter abhängt, wird der Der Basisklassenbereich wird bei der Suche nach unqualifizierten Namen nicht untersucht..."
Dies bedeutet, dass in der Basisklasse definierte Typdefinitionen nicht automatisch im Gültigkeitsbereich der abgeleiteten Klasse verfügbar sind, wenn unqualifizierte Namen verwendet werden. Um dieses Problem zu beheben, muss die Typedef vollständig qualifiziert sein:
typename A<T>::Vec_t v;
Durch die Verwendung des Schlüsselworts „typename“, gefolgt vom vollständig qualifizierten Namen der Typedef, geben Sie explizit an, dass Sie die Typedef aus der Basisklasse verwenden möchten . Dies funktioniert wie erwartet und ermöglicht Ihnen den Zugriff auf die Vektortypdefinition innerhalb der abgeleiteten Klasse.
Das obige ist der detaillierte Inhalt vonWie kann ich auf Basisklassen-Typedefs in abgeleiteten Klassenvorlagen in C zugreifen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!