Maison > Article > développement back-end > Pourquoi la conversion de type implicite échoue-t-elle dans la déduction de modèle ?
Conversion de type implicite dans la déduction de modèle
En C, le mécanisme de conversion de type implicite joue un rôle crucial dans la déduction des arguments de modèle. Cependant, dans certains scénarios, cela peut conduire à un comportement inattendu, comme illustré par l'extrait de code ci-dessous :
<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); // Incorrect conversion //int b = 2; //func(a, b); // Also incorrect return 0; }
Dans le code fourni, l'objectif est d'invoquer la fonction modèle func en convertissant implicitement un int en un Scalaire La raison derrière cet échec est que la déduction des arguments du modèle ne prend pas en compte l'utilisateur. conversions définies. Dans ce scénario, la conversion de int en Scalar Pour résoudre ce problème, il existe plusieurs options : Conversion explicite sur le site de l'appelant : Forcez la conversion en fournissant manuellement un Scalar Guide de déduction : Définir un guide de déduction pour Scalar et call func : Cette approche s'appuie sur le guide de déduction par défaut, qui est suffisant dans ce cas. Instanciation explicite : Instanciez explicitement le modèle func pour le type souhaité : Cela ne fonctionne que si Scalar En conclusion, la déduction des arguments du modèle n'applique pas automatiquement l'utilisateur -conversions définies. Pour utiliser des conversions définies par l'utilisateur dans la déduction d'argument de modèle, il est nécessaire soit de convertir explicitement l'argument sur le site appelant, d'utiliser un guide de déduction le cas échéant, soit d'instancier explicitement le modèle pour le type souhaité. 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!
<code class="cpp">func(a, Scalar<int>{2}); </code>
<code class="cpp">func(a, Scalar{2}); // C++17 only</code>
<code class="cpp">func<int>(a, 2); </code>