Maison >développement back-end >C++ >Pourquoi la déduction des arguments de modèle échoue-t-elle avec `std::map` dans un contexte non déductible ?

Pourquoi la déduction des arguments de modèle échoue-t-elle avec `std::map` dans un contexte non déductible ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-17 07:33:25912parcourir

Why Does Template Argument Deduction Fail with `std::map` in a Non-Deducible Context?

Problèmes liés à la déduction d'arguments de modèle dans des contextes non déductibles

Dans cet extrait de code, nous rencontrons une erreur lorsque nous essayons d'utiliser la fonction de test avec un TMap instance :

struct TMap
{
    typedef std::map<T, T> Type;
};

template<typename T>
T test(typename TMap<T>::Type &amp;tmap_) { return 0.0; }

int main()
{
    TMap<double>::Type tmap;
    tmap[1.1] = 5.2;
    double d = test(tmap); // Error
}

L'erreur provient de l'incapacité du compilateur à déduire l'argument du modèle T à partir de l'argument tmap de la fonction. Cette situation se produit car nous sommes dans un contexte non déductible, où l'argument du modèle ne peut pas être déduit des arguments de l'appel de fonction.

Dans la programmation basée sur un modèle, il existe certaines situations où le compilateur peut automatiquement déduire les arguments du modèle à partir des arguments de l'appel de fonction. C’est ce qu’on appelle la déduction d’arguments de modèle. Cependant, dans ce cas, le compilateur ne peut pas déduire T basé sur tmap_ car il s'agit d'une instance de std::map, qui n'est pas directement liée à TMap::Type.

Si nous devions spécialiser TMap pour un type T spécifique, le compilateur ne serait pas en mesure de déterminer quelle spécialisation appliquer, étant donné que std::map peut être associé à la fois à TMap et TMap.

Pour résoudre ce problème, nous pouvons spécifier explicitement l'argument du modèle T lors de l'appel de la fonction de test :

double d = test<double>(tmap);

En spécifiant double comme argument du modèle, le compilateur peut déduire correctement le type de tmap_ et conclure qu'il correspond à TMap::Type.

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