Przeciążanie operatora strumieniowego >> powoduje błąd

0

Hej, problem jest taki - chcę zdefiniować operator strumieniowy jak w poniższym kodzie:

istream &operator>>(istream  &wyjscie, Gazeta &gaz)
{
    wyjscie >> gaz.nazwa >> gaz.wlasciciel >> gaz.rok_zalozenia;
    return wyjscie;
}

Kompiluje się bez przeszkód. Jednak próbując załadować do obiektu wszystkie trzy zmienne za pomocą:

gazeta >> nazwa >> wlasciciel >> rok_zalozenia;

kompilator bulwersuje się i wypluwa "no match for 'operator>>' (operand types are 'Gazeta' and 'std::string {aka std::basic_string<char>}')". W drugą stronę problemu nie ma, tj. gdy chcę załadować gazetę do pliku, podobnie zdefiniowany operator << działa bez problemu. Gdzie robię błąd?

1
#include <iostream>
using namespace std;

struct Foo {
	string bar1;
	string bar2;
	friend istream& operator>>(istream& in, Foo& foo) {
		return in >> foo.bar1 >> foo.bar2;
	}
};

int main() {
	Foo f;
	cin >> f;
	cout << f.bar1;
	return 0;
}

http://ideone.com/bt54YT

1
Gazeta gaz;
cin>>gaz;
0

Prawdę mówiąc, nie do końca rozumiem. W drugą stronę mam tak:

ostream& operator<< (ostream &wejscie, const Gazeta &gaz)
{
	wejscie << zamienSpacjeNaPodkreslenia(gaz.nazwa) << " " << zamienSpacjeNaPodkreslenia(gaz.wlasciciel) << " " << gaz.rok_zalozenia << "\n";
	return wejscie;
}

I używając go w kodzie (plik jest fstreamem):

    plik << gazeta;

Mam wygenerowaną linijkę w pliku:

Nazwa Wlasciciel 2014

Teraz próbuję zrobić odwrotnie, tj. pobrać tę linijkę z pliku, poszatkować ją, przypisać do czasowych zmiennych i wrzucić do obiektu. Czy takie działanie operatora >> jest możliwe?

1

fstream też jest ostream'em (klasa bazowa).

2
plunio7 napisał(a):

Jednak próbując załadować do obiektu wszystkie trzy zmienne za pomocą:

gazeta >> nazwa >> wlasciciel >> rok_zalozenia;

kompilator bulwersuje się i wypluwa "no match for 'operator>>' (operand types are 'Gazeta' and 'std::string {aka std::basic_string<char>}')".

Pozdrawiam kolegę dyslektyka :): jeśli pierwszym elementem w ciągu jest gazeta, która nie jest std::stream to nie am co się dziwić, że nie działa.
Na początku miał być raczej jakiś plik (strumień).

1 użytkowników online, w tym zalogowanych: 0, gości: 1