Maison >développement back-end >C++ >Pourquoi la déduction des arguments de modèle échoue-t-elle dans des contextes non déduits ?

Pourquoi la déduction des arguments de modèle échoue-t-elle dans des contextes non déduits ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-29 06:29:12377parcourir

Why Does Template Argument Deduction Fail in Nondeduced Contexts?

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 :

  • Erreur 1 : temp(S::type) : impossible de déduire l'argument du modèle pour A
  • Erreur 2 : temp2(S::type,B) : impossible de déduire l'argument du modèle pour A

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!

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