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
Libérer: 2024-11-29 06:29:12
original
321 Les gens l'ont consulté

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;
}
Copier après la connexion

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

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);
Copier après la connexion

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!

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