Heim > Backend-Entwicklung > C++ > Warum führt die Verwendung von „enable_if_t' in Vorlagenargumenten zu Neudefinitionsfehlern?

Warum führt die Verwendung von „enable_if_t' in Vorlagenargumenten zu Neudefinitionsfehlern?

Linda Hamilton
Freigeben: 2024-11-12 10:08:02
Original
367 Leute haben es durchsucht

Why Does Using `enable_if_t` in Template Arguments Lead to Redefinition Errors?

Warum enable_if_t in Vorlagenargumenten Neudefinitionsfehler verursacht

In C wird std::enable_if für die bedingte Typauswahl in Vorlagenargumenten verwendet. Bei Verwendung der neueren Syntax typename std::enable_if_t<...> Anstelle von Typname std::enable_if<...>::type* können Compiler Neudefinitionsfehler auslösen.

Um zu verstehen, warum, betrachten Sie den folgenden Code:

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

Dies Code deklariert zwei Vorlagen, die f basierend darauf überladen, ob T int oder double ist. Wenn der Code jedoch aktualisiert wird, um std::enable_if_t zu verwenden, kommt es zu einem Neudefinitionsfehler:

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

Der Grund für den Fehler ist, dass, obwohl der Standardwert für das zweite Vorlagenargument anders ist, der Vorlagen sind immer noch vom gleichen Typ, templatevoid(). Dies ist gleichbedeutend damit, dass zwei Funktionen print(string, int) mit unterschiedlichen Standardwerten für int haben, was für eine Überladung ungültig ist.

Um das Problem zu beheben, entfernen Sie die Klausel „enable_if“ in den Vorlagenargumenten und ersetzen Sie „typename“ durch „class“:

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

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

Alternativ können Sie einen anderen Typ für das zweite Vorlagenargument angeben:

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

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

Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung von „enable_if_t' in Vorlagenargumenten zu Neudefinitionsfehlern?. 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