Heim > Backend-Entwicklung > C++ > Warum schlägt die Überlastungsauflösung bei impliziter Konvertierung in „std::string' in C fehl?

Warum schlägt die Überlastungsauflösung bei impliziter Konvertierung in „std::string' in C fehl?

Linda Hamilton
Freigeben: 2024-11-06 06:26:02
Original
649 Leute haben es durchsucht

Why Does Overload Resolution Fail with Implicit Conversion to `std::string` in C  ?

Überlastungsauflösungsfehler bei impliziter Konvertierung

Beim Versuch, ein Objekt mithilfe der impliziten Konvertierung in einen String zu streamen, kann es zu einem Überlastungsauflösungsfehler kommen. Dies wird durch den folgenden Code veranschaulicht, der eine Struktur mit einer impliziten Konvertierung in einen String und eine Funktion zum Streamen eines Objekts in die Standardausgabe definiert:

<code class="cpp">#include <string>
#include <ostream>
#include <iostream>

struct NameType {
   operator std::string() { return "wobble"; }
};

struct Person {
   NameType name;
};

int main() {
   std::cout << std::string("bobble");
   std::cout << "wibble";

   Person p;
   std::cout << p.name;
}</code>
Nach dem Login kopieren

Bei der Kompilierung mit GCC 4.3.4 ergibt dieser Code das Folgender Fehler:

prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’
Nach dem Login kopieren

Dieser Fehler tritt auf, weil der freie Funktionsoperator <<(ostream&, string const&) im Überladungssatz nicht berücksichtigt wird. Dies ist auf eine Kombination aus der gewünschten Überladung, nämlich einer Vorlageninstanziierung, und ADL (Argument Dependent Lookup) zurückzuführen.

C 98-Standardabschnitt 14.8.1/4 besagt, dass implizite Konvertierungen für ein Funktionsargument durchgeführt werden, um es zu konvertieren nur dann auf den Typ des entsprechenden Funktionsparameters, wenn der Parametertyp keine Vorlagenparameter enthält, die an der Ableitung von Vorlagenargumenten beteiligt sind. In diesem Fall enthalten alle Argumente der gewünschten Überladung Vorlagenparameter, die am Abzug der Vorlagenargumente teilnehmen, sodass keiner von ihnen seinen Wert aus einer impliziten Konvertierung erhalten kann.

Daher schlägt die Überladungsauflösung fehl und die Fehler wird gemeldet.

Das obige ist der detaillierte Inhalt vonWarum schlägt die Überlastungsauflösung bei impliziter Konvertierung in „std::string' in C 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