Error bei Ausgabe im Iterator
-
der ostream_iterator nutzt den operator<<, um seine Daten auszugeben, also mußt du einen bereitstellen:
ostream& operator<<(ostream& sout,const Data& val) { //gib alle Elemente von val aus return sout; }(muß notfalls als friend von Data deklariert werden - oder eine Data::print(ostream&) nutzen)
-
ich habe jetzt folgendes in die Headerdatei eingefügt:
friend ostream &operator<<(std::ostream &output, const Data &p);Allerdings kommt jetzt diese Fehlermeldung:
Compiling...
Datenbank.cpp
Linking...
Datenbank.obj : error LNK2019: unresolved external symbol "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,class Data const &)" (??6@YAAAV?char_traits@D@std@@@std@@AAV01@ABVData@@@Z) referenced in function "public: class std::ostream_iterator<class Data,char,struct std::char_traits<char> > & __thiscall std::ostream_iterator<class Data,char,struct std::char_traits<char> >::operator=(class Data const &)" (??4?char_traits@D@std@@@std@@QAEAAV01@ABVData@@@Z)
Debug/Datenbank.exe : fatal error LNK1120: 1 unresolved externalsWas hat das zu bedeuten???
Vielen Dank für eure schnellen Antworten. :xmas2:
-
Implementiere die Methode, so wie CStoll es gezeigt hat.
-
Und wo schreibe ich die dann hin?
Sorry für die blöde Frage, aber ich bin noch nicht so bewandert im Programmieren..Vielen Dank
Eva
-
In das Source - File, also die cpp Datei.
ostream& operator<<(ostream& os,const Data& val) { //Angenommen Data hat eine Methode namens getData() os<<val.getData(); return os; }Du könntest es auch direkt in die Headerdatei schreiben, aber das ist nicht so toll.
-
So ihr Lieben,
ich habe jetz folgenen Code in den Header geschrieben:ostream &operator<<(std::ostream &output, const Data &p) { output << "\nFile on "; output << p.name << " " << p.artist << endl; output << "Id: " << p.id << endl; output << "HSV: " << p.hsv << endl; output << "Pfad: " << p.path << endl; output << endl; return output; }Der Compilerschluckt alles, allerdings sind meine Ausgaben komplett falsch. Ich bekomme 41 Datensätze die alle genau so aussehen:
File on
Id: -858993460
HSV: -858993460
Pfad:Vielleicht zur Vollstädnigkeit:
Mein CSV File sieht folgendermaßen aus:1;250;Blaues Pferd;Franz Marc;C:\blue_horse_col.bmp
1;123;No Name;Cesanne;C:\Cesanne.bmp
1;120;Sunflowers;Van Gogh;C:\vanGogh.bmp
1;3;Test;Testkünstler;C:\test.bmp2;;Blaues Pferd;Franz Marc;C:\blue_horse_col.bmp
2;;No Name;Cesanne;C:\Cesanne.bmp
2;;Sunflowers;Van Gogh;C:\vanGogh.bmp
2;;Test;Testkünstler;C:\test.bmp3;;Blaues Pferd;Franz Marc;C:\blue_horse_col.bmp
3;;No Name;Cesanne;C:\Cesanne.bmp
3;;Sunflowers;Van Gogh;C:\vanGogh.bmp
3;;Test;Testkünstler;C:\test.bmpVielen Dank
Eva
-
Hauptsächlich liegts daran.
ifs.getline(line, MAX_LINESIZE,';');du verwendest in Data::readDt() strtok() mit ';' als delimiter.
Du solltest also die ganze zeile dort hinschicken.ifs.getline(line, MAX_LINESIZE );Kleiner tip zum debuggen. eine zeile wie die folgende in Data::readDt() wirkt Wunder.
cout << "parsing '" << line << "'" << endl;BTW: Wenn du schon alle methoden von Data in "data.h" implementieren willst dann solltest du sie schon in der Klassendeclaration implementieren oder inline verwenden. Sonst bekommst du ungute Linkerfehler wenn du data.h in mehreren Übersetzungseinheiten einbindest.
using namespace std; using std::copy; using std::cout; using std::ostream_iterator; using std::vector;Das ist redundant. Entweder usung namespace ... oder using std::...
Das solltest du umbedingt lesen
http://www.research.att.com/~bs/bs_faq2.html#void-main
-
Vielen Daak. Jetzt gibt er zumindest mal irgendwas sinnvolles aus.
Allerdings gibt er jetzt 12 Sätze aus.
mit:
File on "Künstlername" "Pfad"
Id: "HSV-Wert"
Hsv: O
Pfad:Jedes Bild wird 3 mal ausgegeben allerdings beim 2. und 3. Mal mit nur Pfad hinter "File on" und snst nix.
Ich komm nicht dahinter woran es liegt?
Lese ich die Zeilen falsch ein?Vielen Dank
Eva
-
Du rufts strtok zweimal hintereinamder auf
char *token = strtok(line, delimiter); // token = strtok(NULL, delimiter); // das ist zu viel if (token!=NULL) {BTW: Mit std::string und std::stringstream gehts einfacher als mit strtok()
-
Danke Danke Danke...
Genau das wars.
Supi
