Heim > Backend-Entwicklung > C++ > Hauptteil

Warum schlägt die implizite Typkonvertierung bei der Vorlagenableitung fehl?

Barbara Streisand
Freigeben: 2024-10-31 19:31:30
Original
230 Leute haben es durchsucht

 Why Does Implicit Type Conversion Fail in Template Deduction?

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

Im bereitgestellten Code besteht das Ziel darin, die Vorlagenfunktion func durch implizite Konvertierung eines int in aufzurufen ein Skalar Objekt. Überraschenderweise kann der Code jedoch nicht kompiliert werden, da die Ableitung/Ersetzung von Vorlagenargumenten beim ersten Aufruf von func(a, 2) fehlschlägt.

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 ist eine benutzerdefinierte Konvertierung, die bei der Ableitung von Vorlagenargumenten nicht automatisch angewendet wird.

Um dieses Problem zu beheben, gibt es mehrere Optionen:

  • Explizite Konvertierung am Anruferstandort: Erzwingen Sie die Konvertierung, indem Sie manuell einen Skalar bereitstellen. Objekt mit dem gewünschten Wert an der Aufrufstelle:

    <code class="cpp">func(a, Scalar<int>{2}); </code>
    Nach dem Login kopieren
  • Abzugsleitfaden: Definieren Sie einen Abzugsleitfaden für Skalar und rufen Sie die Funktion auf:

    <code class="cpp">func(a, Scalar{2}); // C++17 only</code>
    Nach dem Login kopieren

    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:

    <code class="cpp">func<int>(a, 2); </code>
    Nach dem Login kopieren

    Dies funktioniert nur, wenn Scalar::Scalar(T) nicht explizit ist.

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!

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
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!