operator>> überladen
-
hi,
ich habe nocheinmal ein wenig operatorüberladung wiederholt und habe mich dann auch an die ein - u. ausgabe gewagt. die ausgabe klappt ohne probleme, aber bei dem versuch den operator>> zu überladen, weigert sich mvc++ konsequent meinen code zu kompilieren.
hier der code:
#include <iostream> #include <fstream> using namespace std; class Test { public: Test() {} Test(int value) : m_Value(value) {} ~Test() { m_Value = 0; } int getValue() const { return m_Value; } friend istream& operator>>(istream& in, Test& testit); private: int m_Value; }; ostream& operator<<(ostream& out, const Test& testit) { out << testit.getValue(); return out; } istream& operator>>(istream& in, Test& testit) { in >> testit.m_Value; return in; } int main() { Test test(10); cin >> test >> endl; cout << test << endl; return 0; }
ich weiß, dass es nicht sonderlich schön ist, den operator als friend zu deklarieren. der einfachheit halber, lass ich es aber erstmal so stehn.
danke im voraus
-
Danke für die fehlende Fehlermeldung :p
cin >> test >> endl;
Wo hast du das denn her? cin >> endl; ??
-
Bashar schrieb:
Danke für die fehlende Fehlermeldung :p
cin >> test >> endl;
Wo hast du das denn her? cin >> endl; ??
oops. gut, das hab ich korrigiert.
allerdings ändert das nichts. die fehlermeldungen bleiben:
error C2248: "m_Value" : Kein Zugriff auf private Element, dessen Deklaration in der Klasse "Test" erfolgte (ich hab doch extra operator>> als friend deklariert!?)
Siehe Deklaration von 'm_Value' (wie gesagt, operator>> is doch friend von Test)
C2593: 'Operator >>' ist mehrdeutig
hoffe, das hilft.
-
geht nicht:
cin >> test << endl;
test << endl -> gibt ostream& zurück
daraus ergibt sich dann:
cin >> tmpReferenz; // tmpReferenz == ostream&
und es gibt keinen >>-operator der mit istream& arbeitet.allerdings bekomm ich keine fehler von wegen "private elemente.."
-
Ist das da so wie gepostet 1:1 das Programm mit dem du das Problem hast? Es scheint als würden die Deklaration und die Definition des operator>> nicht übereinstimmen.
-
soweit windows copy & paste fehlerfrei beherrscht, sollte das das programm sein
-
ich galubs nicht.
ich habe jetzt einen neuen projektarbeitsbereich erstellt und den code darein kopiert. jetzt klappt es wunderbar. ich frag mich zwar wieso, aber naja.
das problem hat sich somit erledigt. danke für die versuche zu helfen
-
fräger schrieb:
ich galubs nicht.
ich habe jetzt einen neuen projektarbeitsbereich erstellt und den code darein kopiert. jetzt klappt es wunderbar. ich frag mich zwar wieso, aber naja.
das problem hat sich somit erledigt. danke für die versuche zu helfen
rubbish. es tut mir leid, aber ich habe mich wieder zu früh gefreut. die ausgabe von "hallo" hat mich etwas stutzig gemacht und satmmte aus einem alten projekt. wieder in einem neuen projektarbeitsbereich kommen wieder besagte fehlermeldungen
-
ich habe jetzt mal einen anderen compiler runtergeladen (dev-c++) und er kompiliert den code anstandslos...
-
hallo nochmal,
ich habe ein neues problem mit meiner klasse.
ich habe meine klasse "Test" nun versucht zum template umzubauen, was allerdings am überladenen operator>>() scheitert. hier die relevanten code-auszüge:
template <class T> class Test { public: //... template <class T> friend istream& operator>>(istream& in, Test<T>& testit); private: T m_Value; };
so ist der operator>>() definiert:
template <class T> istream& operator>>(istream& in, Test<T>& testit) { in >> testit.m_Value; return in; //error C2562: '>>' : 'void'-Funktion gibt einen Wert zurueck }
wenn ich nun in der main-funktion folgendes schreibe:
int main() { //... Test<int> test(10); cin>>test; //Siehe Verweis auf Instantiierung der kompilierten Funktionsvorlage 'void __cdecl operator >>(class std::basic_istream<char,struct std::char_traits<char> > &,class Test<int> &)' return 0; }
bekomme ich fehler, wie in den kommentaren zu sehen sind.
das ganze muss irgendwie mit der tatsache, dass >> als friend deklariert ist zusammenhängen, denn beim überladenen operator<< funktioniert alles wunderbar.wäre dankbar, wenn mal jemand drüberschauen würde
-
Hi,
bei mir hat diese Variante ganz gut funktioniert.
Versuche das mal so in Deinem Template zu benutzen. Vielleicht funzt Dein Template ja dann.
(Ich versuche nur noch, das mit friend hinzubekommen, aber funzen tut es so schon mal.)class Test { public: Test() {} Test(int value) : m_Value(value) {} ~Test() { m_Value = 0; } int getValue() const { return m_Value; } void setValue(int value) { m_Value = value; } //friend einfach weglassen und setValue() benutzen, da sonst error C2593: 'operator >>' is ambiguous //friend istream& operator>>(istream& in, Test& test); private: int m_Value; }; ostream& operator<<(ostream& out, const Test& test) { out << test.getValue(); return out; } istream& operator>>(istream& in, Test& test) { char buf[12]; in >> buf; test.setValue(atoi(buf)); return in; }
-
Kann mir einer verraten, warum ich bei dieser Implementierung nach dem Aufruf von cin>>test; die Fehlermeldung:
error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'class Test' (or there is no acceptable conversion)
bekomme?class Test { public: Test() {} Test(int value) : m_Value(value) {} ~Test() { m_Value = 0; } int getValue() const { return m_Value; } void setValue(int value) { m_Value = value; } istream& operator>>(istream& in){ char buf[12]; in >> buf; m_Value = atoi(buf); return in; } private: int m_Value; };
-
fit schrieb:
Kann mir einer verraten, warum ich bei dieser Implementierung nach dem Aufruf von cin>>test; die Fehlermeldung:
error C2679: binary '>>' : no operator defined which takes a right-hand operand of type 'class Test' (or there is no acceptable conversion)
bekomme?Den operator, den du da implementiert hast, müsstest du mit
test >> cin;
aufrufen.
-
Ups...
-
Falls Du noch nicht den Visual Studio Service Pack (worin auch die Fixes für Visual C++ enthalten sind - aktuell ist Service Pack 5 glaube ich) installiert hast, dann solltest Du das jetzt tun. Denn so einen Fehler hatte ich auch mal (ich hab das Posting nur mal übereflogen, deswegen weiß ich nicht ob's das gleiche ist).
Denn in diesem Fall ist ein Fehler im Visual Studio (was ja das erfolgreiche Compilieren mit 'nem anderen Compiler belegt).
Da ist der SP zu finden (für Visual Studio/C++ 6.0):
http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/dnldoverview.aspx