Heim > Backend-Entwicklung > C++ > Warum führt das Streamen eines Objekts mit impliziter Konvertierung in einen String zu einem Fehler bei der Überlastungsauflösung?

Warum führt das Streamen eines Objekts mit impliziter Konvertierung in einen String zu einem Fehler bei der Überlastungsauflösung?

Susan Sarandon
Freigeben: 2024-11-05 00:57:01
Original
377 Leute haben es durchsucht

Why Does Streaming an Object with Implicit Conversion to String Cause Overload Resolution Failure?

Überlastungsauflösungsfehler beim Streamen von Objekten über implizite Konvertierung in String

Problembeschreibung

Implizit Von der Konvertierung in einen String wird im Allgemeinen abgeraten, und das Überladen des Ausgabeoperators (<<) für benutzerdefinierte Typen ist ein Problem stattdessen der empfohlene Ansatz. Code mit impliziter Konvertierung und Objekt-Streaming kann jedoch zu Mehrdeutigkeiten bei der Überlastungsauflösung führen.

Betrachten Sie das folgende Beispiel:

<code class="cpp">struct NameType {
  operator std::string() { return "wobble"; }
};

struct Person {
  NameType name;
};

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

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

Fehlermeldung

Das Kompilieren dieses Codes mit GCC 4.3.4 ergibt Folgendes Fehler:

prog.cpp: In function ‘int main()’:
prog.cpp:18: error: no match for ‘operator<<’ in ‘std::cout << p.Person::name’
Nach dem Login kopieren

Grundursache

Der Überlastsatz enthält aufgrund einer Kombination von Faktoren nicht die gewünschte Überlast:

  • Template Instantiation: Die gewünschte Überladung ist eine Instanziierung einer Template-Funktion mit mehreren Templates Parameter.
  • Implizites Konvertierungsverbot: Die implizite Konvertierung in einen String (NameType::operator std::string) verhindert, dass die gewünschte Überladung berücksichtigt wird.

ADL-Einschränkung

Argument-Dependent Lookup (ADL) ist nicht direkt beteiligt dieses Problem. ADL ist eine Funktion zur Kompilierungszeit, die angewendet wird, wenn der Compiler einen Funktionsaufruf auflöst. In diesem Fall wird die implizite Konvertierung in einen String vom Compiler durchgeführt, ohne dass ein Funktionsaufruf erforderlich ist.

Das obige ist der detaillierte Inhalt vonWarum führt das Streamen eines Objekts mit impliziter Konvertierung in einen String zu einem Fehler bei der Überlastungsauflösung?. 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