Heim > Backend-Entwicklung > C++ > Hauptteil

Warum schlägt die implizite Typkonvertierung bei der Ableitung von Vorlagenargumenten fehl?

Barbara Streisand
Freigeben: 2024-10-28 23:17:30
Original
785 Leute haben es durchsucht

Why Does Implicit Type Conversion Fail in Template Argument Deduction?

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

Hier besteht das Ziel darin, die Vorlagenfunktion func() mit einer Ganzzahl aufzurufen a und ein implizit konvertierter Skalar Objekt 2. Dies führt jedoch zu einem Kompilierungsfehler. Warum ist das so?

Verstehen des Fehlers

Der Compiler führt die Ableitung von Vorlagenargumenten nicht durch, weil:

  • Implizite Typkonvertierung wird nicht berücksichtigt während der Ableitung von Vorlagenargumenten.
  • Die Konvertierung von int nach Scalar ist eine benutzerdefinierte Konvertierung, die vom Compiler beim Abzug nicht erkannt wird.

Lösungsoptionen

Um dieses Problem zu beheben, können verschiedene Ansätze gewählt werden :

  • Explizite Konvertierung auf der Anruferseite:
    Konvertieren Sie das Argument manuell auf der Anruferseite:

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

    <code class="cpp">func(a, Scalar{2});</code>
    Nach dem Login kopieren
  • Explizit Vorlageninstanziierung (nur wenn der Scalar-Konstruktor nicht explizit ist):
    Instanziieren Sie explizit die func()-Vorlage für den gewünschten Typparameter:

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

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!

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!