Déduction d'argument de modèle et contextes non déduits
En C, la déduction d'argument de modèle permet au compilateur de déterminer les types de paramètres de modèle en fonction des types d'arguments passés à la fonction ou à la classe du modèle. Cependant, ce mécanisme peut échouer dans certains scénarios impliquant des contextes non déduits.
Considérez l'extrait de code suivant :
template <class T> struct S { typedef T& type; }; template <class A> A temp(S<A>::type a1) { return a1; } template <class A, class B> B temp2(S<A>::type a1, B a2) { return a1 + a2; }
Ici, la structure S sert à obtenir une référence au type détenu par le paramètre de modèle A. Cependant, lorsque vous tentez d'appeler ces fonctions avec des valeurs entières, comme indiqué ci-dessous, le compilateur signale erreurs :
int main() { char c = 6; int d = 7; int res = temp(c); int res2 = temp2(d, 7); }
Messages d'erreur :
Explication :
Le problème se pose car le type de A est utilisé uniquement dans un contexte non déduit, ce qui signifie que le compilateur ne peut pas le déduire des arguments transmis aux fonctions. En particulier, S::type est considéré comme non déduit car il apparaît dans un type de modèle imbriqué et n'est pas directement lié aux arguments de temp ou temp2.
Solution :
Pour résoudre ce problème et activer la déduction des arguments du modèle, le type de A doit être explicitement spécifié lors de l'appel des fonctions, comme indiqué ci-dessous :
temp<char>(c);
Cette spécification explicite permet au compilateur de déterminer le type de A et d'instancier avec succès les fonctions du modèle.
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!