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
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!