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

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

Barbara Streisand
Barbara Streisandoriginal
2024-12-06 09:45:13946parcourir

Why Does My C   Template Argument Deduction Fail in Nondeduced Contexts?

Échec de la déduction des arguments du modèle : compréhension des contextes non déduits

Dans votre code, vous avez défini deux fonctions (temp et temp2) qui visent à déduire les arguments du modèle en fonction des types de paramètres. Cependant, vous rencontrez des erreurs du compilateur indiquant qu'il est incapable de déduire ces arguments.

Le problème vient de l'utilisation du mot-clé typename dans les définitions de fonction :

// Example 1
template <class A>
A temp(typename S<A>::type a1)

// Example 2
template <class A, class B>
B temp2(typename S<A>::type a1, B a2)

Lors de l'utilisation des paramètres de modèle de modèle , typename est nécessaire pour faire référence aux noms dépendants au sein de la classe modèle. Cependant, ce n'est pas le cas dans le contexte de vos fonctions, où S::type est simplement un type non dépendant.

En C , la déduction d'argument de modèle se produit lorsqu'un paramètre de modèle est utilisé dans un contexte qui détermine son type. Cependant, dans ce cas, le paramètre template A est utilisé dans un contexte non déduit, car il apparaît uniquement dans la déclaration d'un type référence :

typedef typename T& type;

De ce fait, le compilateur ne peut pas déduire l'argument template de l'appel de fonction. Pour résoudre ce problème, vous devez spécifier explicitement l'argument du modèle lors de l'appel de ces fonctions :

temp<char>(c);

En fournissant l'argument explicite, le compilateur est capable d'instancier correctement le modèle avec le type approprié.

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