Maison  >  Article  >  développement back-end  >  Pourquoi la conversion de type implicite échoue-t-elle dans la déduction des arguments de modèle ?

Pourquoi la conversion de type implicite échoue-t-elle dans la déduction des arguments de modèle ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-28 23:17:30857parcourir

Why Does Implicit Type Conversion Fail in Template Argument Deduction?

Conversion de type implicite et déduction de modèle

En C, la déduction d'argument de modèle est un mécanisme qui permet de déduire automatiquement les paramètres de type en fonction du arguments de fonction. Cependant, il existe des limites à la conversion de type implicite dans la déduction de modèle.

Considérez l'extrait de code suivant :

<code class="cpp">#include<iostream>
using namespace std;

template<typename Dtype>
class Scalar{
public:
  Scalar(Dtype v) : value_(v){}
private:
  Dtype value_;
};

template<typename Dtype>
void func(int a, Scalar<Dtype> b){ 
  cout << "ok" <<endl;
}

int main(){
  int a = 1;
  func(a, 2); // error: no matching function for call to ‘func(int&, int)’
  return 0;
}

Ici, l'objectif est d'appeler la fonction de modèle func() avec un entier a et un Scalar implicitement converti. objet 2. Cependant, cela entraîne une erreur de compilation. Pourquoi ?

Comprendre l'erreur

Le compilateur ne parvient pas à effectuer la déduction des arguments du modèle car :

  • La conversion de type implicite n'est pas prise en compte pendant la déduction des arguments du modèle.
  • La conversion de int en Scalar est une conversion définie par l'utilisateur, qui n'est pas reconnue par le compilateur lors de la déduction.

Options de solution

Pour résoudre ce problème, plusieurs approches peuvent être adoptées :

  • Conversion explicite sur le site appelant :
    Convertir l'argument manuellement sur le site appelant :

    <code class="cpp">func(a, Scalar<int>{2});</code>
  • Guide de déduction (C 17) :
    Définissez un guide de déduction pour Scalar et appelez func() comme :

    <code class="cpp">func(a, Scalar{2});</code>
  • Explicit Instanciation de modèle (uniquement si le constructeur Scalar n'est pas explicite) :
    Instancier explicitement le modèle func() pour le paramètre de type souhaité :

    <code class="cpp">func<int>(a, 2); </code>

Conclusion

La déduction d'arguments de modèle en C est un mécanisme puissant, mais il présente des limites lorsqu'il s'agit de conversions définies par l'utilisateur. En utilisant les solutions discutées, les développeurs peuvent garantir que les fonctions de modèle sont appelées avec les paramètres de type prévus.

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