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 ?

Pourquoi la déduction des arguments du modèle échoue-t-elle avec les conversions définies par l'utilisateur ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 16:20:29492parcourir

 Why Does Template Argument Deduction Fail with User-Defined Conversions?

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. Pour que cela fonctionne, nous devons soit convertir explicitement l'argument sur le site appelant, soit définir un guide de déduction pour 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!

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