Maison >développement back-end >C++ >Pourquoi l'utilisation de « std::enable_if_t » avec les valeurs par défaut entraîne-t-elle une erreur de redéfinition ?

Pourquoi l'utilisation de « std::enable_if_t » avec les valeurs par défaut entraîne-t-elle une erreur de redéfinition ?

DDD
DDDoriginal
2024-11-12 11:24:02308parcourir

Why Does Using `std::enable_if_t` With Default Values Result in a Redefinition Error?

Problème de redéfinition avec les arguments du modèle activate_if_t

Dans le code fourni, la tentative de conversion de la contrainte de type std::enable_if à l'aide de la nouvelle syntaxe (typename = std::enable_if_t...) entraîne une erreur de redéfinition. En effet, les deux fonctions de modèle :

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

et

template<typename T, typename = std::enable_if_t<std::is_same<double, T>::value>>>
void g() { }

sont toutes deux de type templatevoid(). Le fait que le deuxième argument de type ait des valeurs par défaut différentes n'est pas pertinent, car le compilateur considère les deux modèles comme identiques.

Pour résoudre ce problème, il est nécessaire de supprimer les valeurs par défaut de la contrainte activate_if_t. Cela donne le code suivant :

template<typename T, std::enable_if_t<std::is_same<int, T>::value, int>*>
void g() { }

template<typename T, std::enable_if_t<std::is_same<double, T>::value, int>*>
void g() { }

Dans ce cas, le deuxième argument de type est désormais un pointeur, dont le type dépend du premier. Le compilateur peut remplacer le type T pour déterminer s'il y a un conflit entre les deux modèles, et il résoudra qu'il n'y en a pas.

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