operator >> überladen



  • Hallo,

    es geht um folgendes

    Ich habe ein:

    struct Date{
    	int day;
    	int mon;
    	int year;
    };
    

    Dafür will ich die Operatoren << und >> überladen.

    ostream& operator<<(ostream& o, const Date& d){
    	return o << d.day << "-" << d.mon << "-" << d.year << endl;
    };	
    
    istream& operator>>(istream& i, const Date& d){
    	return i >> d.day >> "-" >> d.mon >> "-" >> d.year;
    };
    

    Allerdings lässt sich die zweite Funktion nicht compilieren und mit der cryptischen Fehlermeldung kann ich nicht anfangen:

    main.cpp: In function »std::istream& operator>>(std::istream&, const Date&)«:
    main.cpp:66: Fehler: ambiguous overload für »operator>>« in »i >> d->Date::day«
    /usr/include/c++/4.1.3/istream:131: Anmerkung: Kandidaten sind: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& ()(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] <nahe Übereinstimmung>
    /usr/include/c++/4.1.3/istream:134: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT, _Traits>& (
    )(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>] <nahe Übereinstimmung>
    /usr/include/c++/4.1.3/istream:137: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& ()(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>] <nahe Übereinstimmung>
    /usr/include/c++/4.1.3/istream:230: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_streambuf<_CharT, _Traits>
    ) [with _CharT = char, _Traits = std::char_traits<char>] <nahe Übereinstimmung>

    Kann mir einer sagen was ich da falsch mache??!!

    Meine zweite Frage ist wie das Überladen für << und >> aussehen muss, wenn ich nicht cin und cout benutzte sondern ifstream, ofstream und/oder fstream??

    Danke schon mal im vorraus.

    Mfg cpt.hawk


  • Administrator

    Habe mir jetzt nicht die Fehlermeldung angeschaut, sondern deinen Code und darin einen Fehler gefunden:

    istream& operator>>(istream& i, const Date& d)
    

    Sollte dies nicht eher so lauten:

    istream& operator>>(istream& i, Date& d)
    

    In eine const Objekt kannst du schliesslich nicht schreiben 😉

    Zur zweiten Frage:
    Musst du nichts ändern. ifstream , ofstream , fstream , istringstream , ostringstream , stringstream usw. haben alle entweder istream , ostream oder beide als Basisklasse(n) 😉

    Und noch zwei Bemerkungen:
    Es heisst voraus, mit einem r 😉
    Benutze bitte C/C++ Code Tags.

    Grüssli



  • Ja das const gehört da nicht hin. Aber es lässt sich immer noch nicht kompilieren:

    Ich bekomme jetzt folgende Meldung:

    main.cpp: In function »std::istream& operator>>(std::istream&, Date&)«:
    main.cpp:66: Fehler: no match für »operator>>« in »((std::istream*)i)->std::basic_istream<_CharT, _Traits>::operator>> [with _CharT = char, _Traits = std::char_traits<char>](((int&)(& d->Date::day))) >> "-"«
    /usr/include/c++/4.1.3/istream:131: Anmerkung: Kandidaten sind: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& ()(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:134: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_ios<_CharT, _Traits>& (
    )(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:137: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& ()(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:169: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:172: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:175: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:178: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:181: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:184: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:187: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:191: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:194: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:198: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:201: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:204: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:207: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(void
    &) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.1.3/istream:230: Anmerkung: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]
    main.cpp:65: Anmerkung: std::istream& operator>>(std::istream&, Date&)



  • Namespaces angegeben?

    std::istream& operator>>(std::istream& i, Date& d)
    


  • Nein das ist es nicht. Am Anfang des Code steht:

    using namespace std;
    


  • cpt.hawk schrieb:

    Nein das ist es nicht. Am Anfang des Code steht:

    using namespace std;
    

    Nächster Versuch:

    #include <istream>
    #include <ostream>
    


  • Leider auch nichts.

    #include <iostream>
    

    hatte ich sowieso drin.



  • cpt.hawk schrieb:

    Leider auch nichts.

    #include <iostream>
    

    hatte ich sowieso drin.

    Dann schaue ich mir mal den Code an.

    Das sollte reichen

    std::istream& operator>>(std::istream& i, Date& d){
    	i >> d.day; i.ignore(); i >> d.mon; i.ignore(); i >> d.year;
        return i;
    };
    

    Warum willst du auch etwas in "-" einlesen!? 🙄



  • Warum willst du auch etwas in "-" einlesen!? 🙄

    Da hast du recht macht eigentlich keinen Sinn.

    std::istream& operator>>(std::istream& i, Date& d){
        i >> d.day; i.ignore(); i >> d.mon; i.ignore(); i >> d.year;
        return i;
    };
    

    So funktioniert es! Vielen Dank.


Anmelden zum Antworten