Heim >Backend-Entwicklung >C++ >Warum schlägt die implizite Typkonvertierung bei der Ableitung von Vorlagenargumenten fehl?
Implizite Typkonvertierung und Template-Ableitung
In C ist die Template-Argument-Ableitung ein Mechanismus, der es ermöglicht, Typparameter basierend auf automatisch abzuleiten Funktionsargumente. Es gibt jedoch Einschränkungen bei der impliziten Typkonvertierung bei der Vorlagenableitung.
Beachten Sie den folgenden Codeausschnitt:
<code class="cpp">#include<iostream> using namespace std; 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: no matching function for call to ‘func(int&, int)’ return 0; }
Hier besteht das Ziel darin, die Vorlagenfunktion func() mit einer Ganzzahl aufzurufen a und ein implizit konvertierter Skalar Verstehen des Fehlers Der Compiler führt die Ableitung von Vorlagenargumenten nicht durch, weil: Lösungsoptionen Um dieses Problem zu beheben, können verschiedene Ansätze gewählt werden : Explizite Konvertierung auf der Anruferseite: Abzugsleitfaden (C 17): Explizit Vorlageninstanziierung (nur wenn der Scalar Fazit Die Ableitung von Vorlagenargumenten in C ist ein leistungsstarker Mechanismus, der jedoch beim Umgang mit benutzerdefinierten Konvertierungen Einschränkungen aufweist. Durch die Verwendung der besprochenen Lösungen können Entwickler sicherstellen, dass Vorlagenfunktionen mit den vorgesehenen Typparametern aufgerufen werden. Das obige ist der detaillierte Inhalt vonWarum schlägt die implizite Typkonvertierung bei der Ableitung von Vorlagenargumenten fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
Konvertieren Sie das Argument manuell auf der Anruferseite:<code class="cpp">func(a, Scalar<int>{2});</code>
Definieren Sie einen Abzugsleitfaden für Skalar und rufen Sie func() auf als:<code class="cpp">func(a, Scalar{2});</code>
Instanziieren Sie explizit die func()-Vorlage für den gewünschten Typparameter:<code class="cpp">func<int>(a, 2); </code>