[C++/STL] Probleem met stream insert operators

Pagina: 1
Acties:

  • MisterData
  • Registratie: September 2001
  • Laatst online: 09-04 12:07
Ik ben een applicatie aan het maken in C++. Ik heb een Time-class die een aantal operatoren overload (+, -, *, += , -= etc). Nu wil ik de gegevens in deze class ook graag serializen naar een std::wostringstream of andere streams. Nou heb ik daarvoor de volgende twee operatoren bedacht:

C++:
1
2
3
4
5
6
7
8
9
 
std::ostream& operator<<( std::ostream& strm, const Time& time ) {
    strm << (int)time;
    return strm;
}
std::istream& operator>>(std::istream& strm,const Time& time) {
    strm >> (int&)time;
    return strm;
}


(de inhoud van de Time-class is te beschrijven in éen int). Nu zeurt de compiler echter al als ik simpelweg:

C++:
1
2
3
Time t(...);
std::wostringstream wos;
wos << t; 


doe. De foutmeldingen die ik krijg zijn onder andere:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
error C2679: binary '<<' : no operator found which takes a right-hand operand of type 'Time' (or there is no acceptable conversion)
        C:\Program Files\Microsoft Visual Studio 8\VC\include\ostream(650): could be 'std::basic_ostream<_Elem,_Traits> &std::operator <<<wchar_t,std::char_traits<wchar_t>>(std::basic_ostream<_Elem,_Traits> &,const char *)' [found using argument-dependent lookup]
        with
        [
            _Elem=wchar_t,
            _Traits=std::char_traits<wchar_t>
        ]
        C:\Program Files\Microsoft Visual Studio 8\VC\include\ostream(697): or 'std::basic_ostream<_Elem,_Traits> &std::operator <<<wchar_t,std::char_traits<wchar_t>>(std::basic_ostream<_Elem,_Traits> &,char)' [found using argument-dependent lookup]
        with
        [
            _Elem=wchar_t,
            _Traits=std::char_traits<wchar_t>
        ]
        c:\projecten\tjshow\tjshow\include\../../TJShow/lib/tinyxml.h(389): or 'std::ostream &operator <<(std::ostream &,const TiXmlNode &)'
        c:\projecten\tjshow\tjshow\include\../../TJShow/lib/tinyxml.h(392): or 'std::string &operator <<(std::string &,const TiXmlNode &)'
        c:\projecten\tjshow\tjshow\include\tjtime.h(154): or 'std::ostream &operator <<(std::ostream &,Time)'


Hoe zorg ik er nou voor dat de compiler weet dat ik graag míjn implementatie van de << operator wil gebruiken? Ik heb al geprobeerd de operators in de std namespace te zetten, om ze andere signatures te geven (Time ipv const Time& enzo...) maar dat hielp allemaal niet.

  • AlanSmithee
  • Registratie: Maart 2004
  • Laatst online: 07-07-2025
Kort komt het er op neer dat jou functies gebruik maken van streams met normale chars, maar dat wstringstream gebruik probeert te maken van functies met wchars. Aangezien je die functies niet gedefineerd hebt kan de compiler die niet vinden.

C++:
1
2
3
4
5
6
7
8
std::wostream& operator<<( std::wostream& strm, const Time& time ) { 
    strm << (int)time; 
    return strm; 
} 
std::wistream& operator>>(std::wistream& strm,const Time& time) { 
    strm >> (int&)time; 
    return strm; 
}


Met bovenstaande code zou het moeten werken. std::istream is vervangenen door std::wistream en std::ostream door std::wostream.

Door middel van templates kan je het nog zo maken dat de zelfde functie werkt voor zo wel std::stringstream en std::wstringstream.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 09-04 12:07
Ah, dat lijkt te werken :) Ik had zelf ook al geprobeerd om er std::wostream/std::wistream van te maken, maar aangezien er ook code was die 'gewoon' ostream/istream gebruikte gaf die dan weer een error... heb nu een wide-versie en een nonwide-versie :)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Yep, dat is het. Overigens: je mag wcout en cout niet door elkaar gebruiken! Als je eenmaal gekozen hebt, dan moet je in de rest van het programma hetzelfde object gebruiken.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • MisterData
  • Registratie: September 2001
  • Laatst online: 09-04 12:07
MSalters schreef op maandag 07 november 2005 @ 19:44:
Yep, dat is het. Overigens: je mag wcout en cout niet door elkaar gebruiken! Als je eenmaal gekozen hebt, dan moet je in de rest van het programma hetzelfde object gebruiken.
Gelukkig gebruik ik geen cout, het is een Windows-applicatie zonder console :)

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:35

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ter aanvulling:
MisterData schreef op maandag 07 november 2005 @ 18:46:
Ik heb al geprobeerd de operators in de std namespace te zetten
Bij de Koenig lookup methode, wordt om de juiste functie (dus ook operators) te vinden óók gekeken in de namespaces van de typen van de argumenten van de functie. Als je je operators dus in dezelfde namespace definieert als je klasse, dan werkt dat gewoon.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Eelis
  • Registratie: Januari 2003
  • Laatst online: 21-02-2015
.

[ Voor 127% gewijzigd door Eelis op 18-02-2015 19:02 ]

Pagina: 1