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
Linda HamiltonOriginal
2024-11-12 10:08:02335Durchsuche

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() { }

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, 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() { }

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!

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