Heim >Backend-Entwicklung >C++ >Wie kann man Mitgliedsfunktionen in Vorlagenklassen korrekt und explizit spezialisieren?
Bei der Arbeit mit Klassenvorlagen ist die explizite Spezialisierung von Mitgliedsfunktionen eine häufige Anforderung. In Fällen, in denen die Klassenvorlage selbst zu einer Vorlage wird, können jedoch aufgrund eines falschen Ansatzes Fehler auftreten.
Stellen Sie sich das folgende Szenario vor:
template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() { }
Dieser Code versucht, ein Mitglied explizit zu spezialisieren Funktion der Klassenvorlage X für den Double-Typ. Wenn jedoch X selbst zu einer Vorlage gemacht wird, meldet der Compiler Fehler:
error: template-id 'get_as<double>' in declaration of primary template error: prototype for 'void X<C>::get_as()' does not match any in class 'X<C>'
Die Lösung besteht darin, auch die umgebende Klassenvorlage explizit zu spezialisieren. Dies kann durch Hinzufügen eines leeren Vorlagenarguments zur Definition des spezialisierten Elements erreicht werden:
template <> template <> void X<int>::get_as<double>() { }
Dadurch wird die Elementfunktion nur für X
Alternativ ist die Verwendung möglich Überladungen, um das gewünschte Verhalten zu erreichen:
template <class C> class X { template<typename T> struct type { }; public: template <class T> void get_as() { get_as(type<T>()); } private: template<typename T> void get_as(type<T>) { } void get_as(type<double>) { } };
Dieser Ansatz basiert auf der Vorlagenspezialisierung, um die entsprechende get_as()-Überladung auszuwählen und sicherzustellen, dass die doppelte Die Typspezialisierung wird wie vorgesehen angewendet.
Das obige ist der detaillierte Inhalt vonWie kann man Mitgliedsfunktionen in Vorlagenklassen korrekt und explizit spezialisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!