Maison >développement back-end >C++ >Pourquoi la déduction des arguments du modèle échoue-t-elle avec les conversions définies par l'utilisateur ?
Déduction d'arguments de modèle et conversions définies par l'utilisateur
Dans la programmation de modèles C, une tâche courante consiste à transmettre une valeur d'un type dans un fonction de modèle qui attend un argument d’un type différent. Pour faciliter cela, le compilateur fournit une déduction d'argument de modèle (TAD), qui peut automatiquement déduire les arguments de modèle en fonction des types d'arguments réels.
Limites de la déduction d'argument de modèle
Cependant, TAD présente des limites. Une limitation est qu'il ne prend pas en compte les conversions définies par l'utilisateur. Cela signifie que si vous avez une conversion définie par l'utilisateur d'un type à un autre, TAD n'appliquera pas cette conversion pour déduire les arguments du modèle.
Étude de cas
Considérez l'extrait de code suivant :
<code class="cpp">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 }
Dans ce code, nous avons une fonction modèle qui prend deux arguments : un entier a et un objet scalaire d'un certain type Dtype. Dans la fonction principale, nous essayons d'appeler func en passant un entier a et un entier 2. Cependant, cela échoue avec une erreur de compilation :
test.cpp: In function ‘int main()’: test.cpp:32:12: error: no matching function for call to ‘func(int&, int)’ func(a, 2); ^ test.cpp:32:12: note: candidate is: test.cpp:25:6: note: template<class Dtype> void func(int, Scalar<Dtype>) void func(int a, Scalar<Dtype> b){ ^ test.cpp:25:6: note: template argument deduction/substitution failed: test.cpp:32:12: note: mismatched types ‘Scalar<Dtype>’ and ‘int’ func(a, 2);</code>
Pourquoi TAD échoue
La raison de l'échec est que TAD ne peut pas appliquer la conversion définie par l'utilisateur de int en Scalar
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!