Implizite Typkonvertierung bei der Template-Ableitung
In C spielt der implizite Typkonvertierungsmechanismus eine entscheidende Rolle bei der Template-Argument-Ableitung. In bestimmten Szenarien kann es jedoch zu unerwartetem Verhalten kommen, wie im folgenden Codeausschnitt dargestellt:
<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); // Incorrect conversion //int b = 2; //func(a, b); // Also incorrect return 0; }
Im bereitgestellten Code besteht das Ziel darin, die Vorlagenfunktion func durch implizite Konvertierung eines int in aufzurufen ein Skalar Der Grund für diesen Fehler ist, dass die Ableitung von Vorlagenargumenten benutzer- definierte Konvertierungen. In diesem Szenario ist die Konvertierung von int nach Scalar Um dieses Problem zu beheben, gibt es mehrere Optionen: Explizite Konvertierung am Anruferstandort: Erzwingen Sie die Konvertierung, indem Sie manuell einen Skalar Abzugsleitfaden: Definieren Sie einen Abzugsleitfaden für Skalar und rufen Sie die Funktion auf: Dieser Ansatz basiert auf dem Standard-Abzugsleitfaden, der in diesem Fall ausreichend ist. Explizite Instanziierung: Instanziieren Sie explizit die Funktionsvorlage für den gewünschten Typ: Dies funktioniert nur, wenn Scalar Zusammenfassend lässt sich sagen, dass der Vorlagenargumentabzug den Benutzer nicht automatisch anwendet -definierte Konvertierungen. Um benutzerdefinierte Konvertierungen bei der Ableitung von Vorlagenargumenten zu verwenden, ist es erforderlich, das Argument entweder explizit auf der Aufruferseite zu konvertieren, ggf. eine Ableitungsanleitung zu verwenden oder die Vorlage explizit für den gewünschten Typ zu instanziieren. Das obige ist der detaillierte Inhalt vonWarum schlägt die implizite Typkonvertierung bei der Vorlagenableitung fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!
<code class="cpp">func(a, Scalar<int>{2}); </code>
<code class="cpp">func(a, Scalar{2}); // C++17 only</code>
<code class="cpp">func<int>(a, 2); </code>