Heim > Backend-Entwicklung > C++ > Warum schlägt die Ableitung von Vorlagenargumenten bei benutzerdefinierten Konvertierungen fehl?

Warum schlägt die Ableitung von Vorlagenargumenten bei benutzerdefinierten Konvertierungen fehl?

Barbara Streisand
Freigeben: 2024-10-27 16:20:29
Original
511 Leute haben es durchsucht

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

Ableitung von Vorlagenargumenten und benutzerdefinierte Konvertierungen

Bei der C-Vorlagenprogrammierung besteht eine häufige Aufgabe darin, einen Wert eines Typs an a zu übergeben Vorlagenfunktion, die ein Argument eines anderen Typs erwartet. Um dies zu erleichtern, stellt der Compiler eine Template-Argument-Ableitung (Template Argument Deduction, TAD) bereit, die automatisch auf die Template-Argumente basierend auf den Typen der tatsächlichen Argumente schließen kann.

Grenzen der Template-Argument-Ableitung

Es gibt jedoch Einschränkungen für TAD. Eine Einschränkung besteht darin, dass benutzerdefinierte Konvertierungen nicht berücksichtigt werden. Das bedeutet, dass TAD bei einer benutzerdefinierten Konvertierung von einem Typ in einen anderen diese Konvertierung nicht anwendet, um die Vorlagenargumente abzuleiten.

Fallstudie

Bedenken das folgende Code-Snippet:

<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
}
Nach dem Login kopieren

In diesem Code haben wir eine Vorlagenfunktion, die zwei Argumente akzeptiert: eine Ganzzahl a und ein Skalarobjekt vom Typ Dtype. In der Hauptfunktion versuchen wir, func aufzurufen, indem wir eine Ganzzahl a und eine Ganzzahl 2 übergeben. Dies schlägt jedoch mit einem Kompilierungsfehler fehl:

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>
Nach dem Login kopieren

Why TAD Fails

Der Grund für den Fehler liegt darin, dass TAD die benutzerdefinierte Konvertierung von int nach Scalar nicht anwenden kann. Damit dies funktioniert, müssen wir entweder das Argument explizit auf der Aufruferseite konvertieren oder einen Abzugsleitfaden für Scalar definieren.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Ableitung von Vorlagenargumenten bei benutzerdefinierten Konvertierungen fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage