Heim > Artikel > Backend-Entwicklung > Warum gibt `Output::Print(\"Hello World\")` \"True\" anstelle von \"Hello World\" aus?
In C können Klassenmethoden überladen werden, um verschiedene Parametertypen zu akzeptieren Möglicherweise stimmte unerwartet mit der booleschen Typüberladung statt mit der erwarteten std::string-Überladung überein.
Problembeschreibung:
Angenommen, wir haben eine Ausgabeklasse, die wie folgt definiert ist:
<code class="cpp">class Output { public: static void Print(bool value) { std::cout << (value ? "True" : "False"); } static void Print(std::string value) { std::cout << value; } };</code>
Beim Aufruf von Output::Print("Hello World ") ist das Ausgabeergebnis „True“ anstelle des erwarteten „Hello World“.
Problemanalyse:
Obwohl wir die std::string-Überladung definiert haben, ist „Hello World“ tatsächlich eine Zeichenarray-Konstante, die implizit in bool konvertiert werden kann. Der Compiler bevorzugt diese Standardkonvertierung gegenüber dem benutzerdefinierten std::string-Konvertierungskonstruktor.
Gemäß dem C-Standard (§13.3.3.2/2) haben Standard-Konvertierungsaufträge Vorrang vor benutzerdefinierten Konvertierungsaufträgen. Daher wählt der Compiler die Bool-Überladung, da diese eine bessere Konvertierungsreihenfolge aufweist.
Problemumgehung:
Um die std::string-Überladung explizit aufzurufen, müssen wir „Hello World“ explizit als std::string:
übergeben<code class="cpp">Output::Print(std::string("Hello World"));</code>
Das obige ist der detaillierte Inhalt vonWarum gibt `Output::Print(\"Hello World\")` \"True\" anstelle von \"Hello World\" aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!