Heim >Backend-Entwicklung >C++ >Wie kann man Mitgliedsfunktionen in Vorlagenklassen korrekt und explizit spezialisieren?

Wie kann man Mitgliedsfunktionen in Vorlagenklassen korrekt und explizit spezialisieren?

Barbara Streisand
Barbara StreisandOriginal
2024-12-03 01:33:14133Durchsuche

How to Correctly Explicitly Specialize Member Functions in Templated Classes?

Explizite Spezialisierung von Mitgliedsfunktionen in Klassenvorlagen

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 spezialisiert.

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!

Stellungnahme:
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