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>
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’
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!