Ü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:
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!