Das bereitgestellte Code-Snippet definiert eine NameType-Struktur mit einer Operator-std::string()-Überladung und einer Person Struktur, die eine NameType-Instanz namens name enthält. Beim Versuch, das Person-Objekt mit std::cout << zu streamen p.name-Anweisung kann der Compiler die Überladung aufgrund eines Fehlers beim Finden eines passenden Operators nicht auflösen<< für den Person::name-Ausdruck.
Das Problem entsteht aufgrund einer C 98-Regel, die implizite Konvertierungen verbietet, wenn eines der Funktionsargumente Vorlagenparameter enthält, die an der Ableitung von Vorlagenargumenten beteiligt sind. In diesem Fall ist die gewünschte Überladung eine Vorlageninstanziierung mit den Vorlagenparametern charT, traits und Allocator. Da alle Argumente Vorlagenparameter enthalten, die an der Argumentableitung beteiligt sind, ist eine implizite Konvertierung nicht zulässig, was zu einem Fehler bei der Überladungsauflösung führt.
Um dieses Problem zu beheben, muss eine explizite Überladungsdeklaration für den Operator<< Es sollte bereitgestellt werden, das die Person-Struktur verwaltet. Dies kann erreicht werden, indem eine benutzerdefinierte Überladungsfunktion mit der folgenden Signatur definiert wird:
<code class="cpp">std::ostream& operator<<(std::ostream& os, const Person& p);</code>
Durch die Bereitstellung einer expliziten Überladung kann der Compiler die Überladung auflösen und das Person-Objekt erfolgreich streamen.
Das obige ist der detaillierte Inhalt vonWarum schlägt die Überlastungsauflösung fehl, wenn ein Objekt über implizite Konvertierung in einen String gestreamt wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!