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
Susan SarandonOriginal
2024-11-05 00:57:01359Durchsuche

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>

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’

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!

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