Heim > Backend-Entwicklung > C++ > Hauptteil

Warum erhalte ich Neudefinitionsfehler, wenn ich std::enable_if_t in Vorlagenargumenten verwende?

Patricia Arquette
Freigeben: 2024-11-27 02:23:14
Original
954 Leute haben es durchsucht

Why do I get redefinition errors when using std::enable_if_t in template arguments?

Anomale Neudefinitionsfehler mit std::enable_if_t in Vorlagenargumenten

In C ist std::enable_if eine Metafunktion, die eine bedingte Vorlagenaktivierung basierend auf bestimmten Einschränkungen ermöglicht. Es wurde kürzlich durch das prägnantere std::enable_if_t ersetzt. Beim Versuch, vorhandenen Code zu portieren, um die neue Syntax zu verwenden, stoßen einige Benutzer jedoch auf unerwartete Neudefinitionsfehler.

Beispielcode

Betrachten Sie den folgenden Code, der mit std: geschrieben wurde: enable_if:

template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
Nach dem Login kopieren

Dieser Code wird erfolgreich kompiliert, mit separaten Spezialisierungen für int und double. Angenommen, wir möchten dies mit der Syntax std::enable_if_t umschreiben:

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
Nach dem Login kopieren

Unerwarteter Fehler

Entgegen den Erwartungen kann dieser aktualisierte Code nicht kompiliert werden. mit GCC 5.2 Berichterstattung:

error: redefinition of 'template<class T, class> void g()'
       void g() { }
Nach dem Login kopieren

Erklärung

Der Fehler liegt darin, dass std::enable_if_t einen Typ und keine Bedingung darstellt. Wenn es als Vorlagenargument verwendet wird, gibt es eine Typbeschränkung an. Im ursprünglichen std::enable_if-Fall ist der zweite Vorlagenparameter ein Zeigertyp, während er in der std::enable_if_t-Version zu einem Typalias wird. Dies führt zu zwei verschiedenen Vorlagenargumenten mit demselben Typ (void()).

Lösung

Um diese Mehrdeutigkeit zu vermeiden, müssen wir sicherstellen, dass der zweite Vorlagenparameter stellt eine eindeutige Typbeschränkung dar. Eine Möglichkeit, dies zu erreichen, ist die Verwendung eines Dummy-Template-Parameters:

template<typename T,
         typename U = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename U = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
Nach dem Login kopieren

In diesem Fall ist U ein Dummy-Parameter, der ausschließlich der Unterscheidung der beiden Template-Argumente dient. Mit dieser Änderung wird der Code erfolgreich kompiliert.

Das obige ist der detaillierte Inhalt vonWarum erhalte ich Neudefinitionsfehler, wenn ich std::enable_if_t in Vorlagenargumenten verwende?. 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