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
-
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
constObjekt kannst du schliesslich nicht schreiben
Zur zweiten Frage:
Musst du nichts ändern.ifstream,ofstream,fstream,istringstream,ostringstream,stringstreamusw. haben alle entwederistream,ostreamoder 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.