Maison > Article > développement back-end > Pourquoi la conversion de type implicite échoue-t-elle dans la déduction des arguments de modèle ?
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 Comprendre l'erreur Le compilateur ne parvient pas à effectuer la déduction des arguments du modèle car : Options de solution Pour résoudre ce problème, plusieurs approches peuvent être adoptées : Conversion explicite sur le site appelant : Guide de déduction (C 17) : Explicit Instanciation de modèle (uniquement si le constructeur Scalar 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!
Convertir l'argument manuellement sur le site appelant :<code class="cpp">func(a, Scalar<int>{2});</code>
Définissez un guide de déduction pour Scalar et appelez func() comme :<code class="cpp">func(a, Scalar{2});</code>
Instancier explicitement le modèle func() pour le paramètre de type souhaité :<code class="cpp">func<int>(a, 2); </code>