Heim  >  Artikel  >  Backend-Entwicklung  >  Warum schlägt die implizite Typkonvertierung bei der Vorlagenableitung fehl?

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

Barbara Streisand
Barbara StreisandOriginal
2024-10-31 19:31:30231Durchsuche

 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;
}

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

    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>

    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!

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