Maison >développement back-end >C++ >Pourquoi C ne peut-il pas déduire des arguments de modèle dans des contextes non déductibles ?

Pourquoi C ne peut-il pas déduire des arguments de modèle dans des contextes non déductibles ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-26 13:47:10889parcourir

Why Can't C   Deduce Template Arguments in Non-Deducible Contexts?

Pourquoi C ne peut-il pas déduire T dans des contextes non déductibles ?

Dans l'extrait de code donné, une structure de modèle TMap est définie avec un type imbriqué Type qui représente la spécialisation de std::map en utilisant l'argument de modèle T. Cependant, le compilateur ne parvient pas à déduire T dans la fonction test.

Contexte non déductible

L'erreur se produit car le code appelle test avec un argument qui a le type typename TMap::Type&, où T n’est pas explicitement spécifié. Cette situation est appelée un contexte non déductible.

Ambiguïté dans l'inférence de type

Dans un contexte non déductible, le compilateur est impossible de déduire l'argument du modèle car le type de l'argument ne détermine pas de manière unique T. Par exemple, considérons ce qui suit scénario :

template <>
struct TMap<SomeType> {
  typedef std::map<double, double> Type;
};

template <>
struct TMap<OtherType> {
  typedef std::map<double, double> Type;
};

Dans ce cas, TMap::Type et TMap::Type sont identiques à std::map. Par conséquent, le compilateur ne peut pas déduire si T est SomeType ou OtherType.

Conséquences

La limitation des contextes non déductibles a des implications importantes :

  • Cela empêche le compilateur de spécialiser implicitement les modèles en fonction des types d'arguments transmis à fonctions.
  • Cela nécessite une déduction explicite d'argument de modèle ou une spécification explicite d'argument de modèle lors de l'appel de fonctions avec des types génériques comme arguments.

Atténuation

Pour atténuer cette limitation, on peut utiliser des techniques telles que les arguments de modèle de modèle ou std::is_same_v de C 20 pour déduire manuellement les arguments de modèle ou fournir un paramètre de modèle explicite. listes.

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