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

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-27 16:20:29386Durchsuche

 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
}

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>

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!

Stellungnahme:
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