2009-08-19 3 views
1

Wie kann ich von einem std::istream mit operator>> lesen?Wie kann ich von einem std :: isorem lesen (mit Operator >>)?

Ich habe versucht, die folgenden:

void foo(const std::istream& in) { 
    std::string tmp; 
    while(in >> tmp) { 
    std::cout << tmp; 
    } 
} 

Aber es gibt einen Fehler:

error: no match for 'operator>>' in 'in >> tmp' 
+0

die istream sollte nicht const für einen Start. Der Status des iStream-Objekts muss sich ändern, wenn Sie Daten daraus ziehen. –

Antwort

9

Operator >> ändert Stream, also nicht von const, nur eine Referenz übergeben.

+0

Danke! Überraschend, dass das Lesen aus dem Stream es modifizieren sollte, aber vermutlich wird ein Positionszeiger durch Lesen weitergebracht. – Frank

+2

Es sollte nicht überraschend sein. Das Lesen von einem Intream ändert nun das, was Sie später aus demselben Stream lesen werden. Dies ist ein beobachtbarer externer Effekt und sollte daher berücksichtigt werden, um das Objekt unabhängig von den internen Implementierungsdetails des Positionszeigers zu modifizieren. –

1

Sie, dass der richtige Weg. Sind Sie sicher, dass Sie alle benötigten Header hinzugefügt haben? (<string> und <iostream>)?

+0

Ja, und sind enthalten. – Frank

+0

Eugene hat Recht. Ich habe die const-Referenz nicht bemerkt. Der Grund, warum es sich mit diesem speziellen Fehler beschwert, liegt daran, dass es keine Version von Operator >> gibt, die einen Const-Stream verwendet. –

3

Verwenden Sie eine nicht konstante Referenz:

void foo(std::istream& in) { 
    std::string tmp; 
    while(in >> tmp) { 
    std::cout << tmp; 
    } 
} 
Verwandte Themen