Maison >développement back-end >C++ >Pourquoi l'utilisation de « enable_if_t » dans les arguments du modèle entraîne-t-elle des erreurs de redéfinition ?

Pourquoi l'utilisation de « enable_if_t » dans les arguments du modèle entraîne-t-elle des erreurs de redéfinition ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-12 10:08:02335parcourir

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

Pourquoi activate_if_t dans les arguments du modèle provoque des erreurs de redéfinition

En C, std::enable_if est utilisé pour la sélection de type conditionnelle dans les arguments du modèle. Lors de l'utilisation de la syntaxe la plus récente, typename std::enable_if_t<...> à la place du typename std::enable_if<...>::type*, les compilateurs peuvent générer des erreurs de redéfinition.

Pour comprendre pourquoi, considérez le code suivant :

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

Ceci le code déclare deux modèles qui surchargent f selon que T est un entier ou un double. Cependant, lorsque le code est mis à jour pour utiliser std::enable_if_t, cela provoque une erreur de redéfinition :

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

La raison de l'erreur est que même si la valeur par défaut du deuxième argument du modèle est différente, le les modèles sont toujours du même type, templatevoid(). Cela équivaut à avoir deux fonctions print(string, int) avec des valeurs int par défaut différentes, ce qui n'est pas valide en cas de surcharge.

Pour résoudre le problème, supprimez la clause activate_if dans les arguments du modèle et remplacez typename par 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() { }

Vous pouvez également spécifier un type différent pour le deuxième argument du modèle :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn