Maison > développement back-end > C++ > le corps du texte

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

Barbara Streisand
Libérer: 2024-10-27 16:20:29
original
385 Les gens l'ont consulté

 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
}
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!