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, template
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!