Heim > Artikel > Backend-Entwicklung > Warum führt die Verwendung von „enable_if_t“ in Vorlagenargumenten zu Neudefinitionsfehlern?
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() { }
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() { }
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, template
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() { }
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() { }
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!