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
struct TMap { typedef std::map<T, T> Type; }; template<typename T> T test(typename TMap<T>::Type &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
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
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
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!