Eine der leistungsstarken Funktionen von C, Curiously Recurring Template Pattern (CRTP), ermöglicht statischen Polymorphismus. Dies ermöglicht eine flexible Kompilierungszeit bei der Bestimmung des Typs der erstellten Objekte basierend auf den Vorlagenargumenten. Die Erweiterung von CRTP, um die Änderung von Funktionsrückgabetypen basierend auf abgeleiteten Typen zu ermöglichen, stellt jedoch eine Herausforderung dar.
Betrachten Sie den folgenden Code, der versucht, CRTP zu verallgemeinern:
template <typename derived_t> class base { public: typedef typename derived_t::value_type value_type; value_type foo() { return static_cast<derived_t*>(this)->foo(); } }; template <typename T> class derived : public base<derived<T>> { public: typedef T value_type; value_type foo() { return T(); } };
Dieser Code kann nicht kompiliert werden Microsoft Visual Studio 2010 aufgrund des Fehlers: „value_type“ ist kein Mitglied von 'derived
Das Problem ergibt sich aus der Tatsache, dass „derived“ unvollständig ist, wenn es als Vorlagenargument für „base“ in seiner Basisklassenliste verwendet wird. Um dieses Problem zu beheben, besteht eine übliche Problemumgehung darin, eine Traits-Klassenvorlage zu verwenden.
Einführung der base_traits-Vorlage:
template <typename derived_t> struct base_traits;
Neudefinition der Basisklasse mithilfe der Traits:
template <typename derived_t> struct base { typedef typename base_traits<derived_t>::value_type value_type; value_type base_foo() { return base_traits<derived_t>::call_foo(static_cast<derived_t*>(this)); } };
Und Spezialisierung auf Basismerkmale für abgeleitete:
template <typename T> struct base_traits<derived<T> > { typedef T value_type; static value_type call_foo(derived<T>* x) { return x->derived_foo(); } };
Dieser Ansatz ermöglicht die Verwendung von sowohl Typen als auch Funktionen aus der abgeleiteten Klasse durch die Merkmale. Durch die Spezialisierung von base_traits für jedes Vorlagenargument können Sie die erforderlichen Mitglieder für jede abgeleitete Klasse bereitstellen.
Das obige ist der detaillierte Inhalt vonWie können wir Kompilierzeitfehler bei der Verwendung von CRTP und Typedef in von C abgeleiteten Klassen beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!