2016-07-15 19 views
0

Ich habe ein kleines Code-Snippet, das versucht, "< <" Operator von Std :: Cout zu überlasten.Überladen << Operator mit ostream funktioniert nicht. Warum?

#include<iostream> 
using namespace std; 

ostream& operator<<(ostream& out,const string& str) 
{ 
    out << "overloading" << str << "done"; 
    return out; 
} 

int main() 
{ 
    cout << "string123"; 
} 

Ausgabe: string123. Es scheint, dass meine Überladungsfunktion nicht aufgerufen wird. Warum?

+0

Vielleicht, weil es schon * ist * [eine Überlastung des Ausgabeoperator] (http: //en.cppreference.com/w/cpp/string/basic_string/operator_ltltgtgt), das eine 'std :: string 'akzeptiert? –

+2

@JoachimPileborg Wahrscheinlicher, eine, die 'const char *' akzeptiert. – juanchopanza

+0

@JoachimPileborg Die Überladung, die 'std :: string 'akzeptiert, ist in' 'header definiert, was hier eindeutig nicht enthalten ist. –

Antwort

1

Zunächst einmal streamen Sie keine std::string, sondern eine const char*. Sie können das beheben, indem Sie stattdessen cout << std::string("string123") schreiben (demo; obwohl, ew).

Beachten Sie, dass es in <string> bereits eine solche Überlastung ist, und Ihre Implementierung offenbar nur geschieht gehen <string> durch <iostream> aufzunehmen (as does mine und wie ist ihr Vorrecht). Allerdings ist Ihre Version (nachdem Sie das Update oben durchgeführt haben) eine bessere Übereinstimmung, da ADL nicht aufgerufen werden muss, um es zu finden.

1

Sie sollten einen String-Typ zu << senden:

ostream& operator<<(ostream& out,const string& str) 
{ 
    out<<"overloading"; 
    return out; 
} 

int main() 
{ 
    string s = "string123"; 
    cout << s; 
} 

Beachten Sie, dass wieder die Zeichenfolge sendet selbst in der << Definition unendliche Rekursion machen für

out << "overloading" << str <<"done" 
+0

Ihr Beispiel ist falsch, str wird nicht nach out gesendet – buld0zzr

+0

@ buld0zzr ich gerade lief es und es funktioniert wie erwartet –

+0

Es Ausgabe "Überladung" Zeichenfolge, aber nicht "string123" – buld0zzr

1

sind Sie im Grunde selbst schießen in der Fuß in deinem Beispiel. Sie überladen operator<< für std::string Typ, so sollten Sie erwarten, dass es jedes Mal aufgerufen wird, wenn Sie versuchen, eine "Std :: string" an out zu senden, wodurch Runtime-Stack überlastet. Damit es funktioniert, Sie:

  • Notwendigkeit zur Ausgabe eines char * Typ out in operator<< Überlastung, so dass es verursacht keine unendliche Rekursion
  • eine tatsächliche std::string in main senden.

Hier ist ein funktionierendes Beispiel ohne Laufzeitstapelüberlauf Problem:

#include<iostream> 
using namespace std; 
ostream& operator<<(ostream& out, const string& str) 
{ 
    out << "overloading" << str.c_str() << "done"; 
    return out; 
} 

int main() 
{ 
    cout << std::string("string123"); 
} 

Der Ausgang ist

overloadingstring123done 
+0

str.c_str() ist alle macht Unterschied :) .. danke – user2531608

+0

@ user2531608 upvote und Antwort Annahme ist stackoverflow Weise, Dank zu sagen :) – buld0zzr

Verwandte Themen