2009-04-02 22 views
0

Ich habe daran gearbeitet, dieses Programm abzuschließen, wo es mehrere Strukturen in eine Datei speichert, kann sie zurück lesen und bearbeiten, dann speichern Sie sie alle in eine Datei. Ich habe an der Logik gearbeitet, ganz zu schweigen von viel Hilfe von anderen und einer Menge von googelnden Stunden ... jetzt bekomme ich einen Kompilierungsfehler. Jede Hilfe wäre sehr willkommen.Compiler Fehler mit `<<`

Code:

template<typename T> 
void writeVector(ofstream &out, const vector<T> &vec); 

struct InventoryItem { 
    string Item; 
    string Description; 
    int Quantity; 
    int wholesaleCost; 
    int retailCost; 
    int dateAdded; 
} ; 


int main(void) 
{ 
    vector<InventoryItem> structList; 
    ofstream out("data.dat"); 
    writeVector(out, structList); 
    return 0; 
} 

template<typename T> 
void writeVector(ofstream &out, const vector<T> &vec) 
{ 
    out << vec.size(); 

    for(vector<T>::const_iterator i = vec.begin(); i != vec.end(); i++) 
    { 
     out << *i; // error C2679 
    } 
} 

Compiler-Fehler:

1>.\Project 5.cpp(128) : error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'const InventoryItem' (or there is no acceptable conversion) 
// listed overload variants skipped 
1>  while trying to match the argument list '(std::ofstream, const InventoryItem)' 
1>  .\Project 5.cpp(46) : see reference to function template instantiation 'void writeVector<InventoryItem>(std::ofstream &,const std::vector<_Ty> &)' being compiled 
1>  with 
1>  [ 
1>   _Ty=InventoryItem 
1>  ] 
+0

Verwenden Sie einen kürzeren Titel und verschieben Sie den aktuellen Titel in den Text der Frage. Es ist schwer, die Frage zu lesen, weil die Titelformatierung für so lange Dinge nicht gut geeignet ist. –

+0

Ahhh Entschuldigung! Ich dachte "Hilfe bei diesem Kompilierfehler" wäre zu vage. Ich versuche so genau wie möglich zu sein! – OneShot

+0

Versuchen Sie etwas wie "Compiler Fehler mit '<<' Operator" – Colin

Antwort

8

Sie haben keine operator<< definiert, die angeben würde, wie Ihre InventoryItem auf einen Ausgabestream gedruckt werden soll. Sie versuchen, es zu drucken, und der Compiler weiß nicht wie. Sie müssen eine Funktion wie diese definieren:

std::ostream& operator<<(std::ostream &strm, const InventoryItem &i) { 
    return strm << i.Item << " (" << i.Description << ")"; 
} 
0

Sie versuchen, die << Operator für Ihre Struktur zu verwenden, aber dass Betreiber nicht für diesen Typ definiert . Versuchen Sie stattdessen, spezifische Datenelemente auszugeben.

+0

Warte ... was meinst du? Können Sie ein kurzes Beispiel geben? Es tut uns leid! – OneShot

+0

Etwas wie "out << * i.Item" statt "out << * i". – Kalium

0

Der < < Operator ist definiert als „shift Bits nach links“.

Die IO-Klassen überschreiben diesen Operator und definieren < <, um diese Struktur auszudrucken. Wenn der Compiler ein Ganzzahlelement auf der rechten Seite sieht, nimmt er an, dass Sie die "Shiftbots links" meinen und nach einem intger auf der linken Seite suchen, aber stattdessen ein IO-Stream-Objekt finden.

Versuchen Sie, den Ganzzahlwert in eine Zeichenfolge zu konvertieren, bevor Sie ihn an den Stream senden.

+0

werden beide Seiten ausgewertet. Es ist vollkommen in Ordnung, int in Streams einzufügen - z.B.: std :: strstream str; str << int (5); – qwerty

Verwandte Themen