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
Libérer: 2024-11-12 10:08:02
original
339 Les gens l'ont consulté

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() { }
Copier après la connexion

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() { }
Copier après la connexion

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() { }
Copier après la connexion

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() { }
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal