[linux] Re: OT: g++2.95/3.2 and ambiguous overload
Jozef Kosoru
zyzstar na uid0.sk
Úterý Prosinec 3 16:13:43 CET 2002
> > Povedz mi aspon jeden pripad, kedy nemozes pouzit
> > const referenciu...
>
> potrebujem portovat jeden softik na gcc3.2 (C++ Servlet Container),
> ale narazil som akurat na tomto, skusal som tam nechat templatu len s
> referenciou alebo bez nej ale vzdy to na niecom papuluje ... z toho co
> som zistil to nezozerie napr. toto:
>
> re << " <head><title>Cookie Demo</title></head>" << endl;
>
> no a ako javista a c-ckar mam zatial z c++ pekny chaos ...
No predpokladam, ze problem robi manipulator 'endl'. To, ze to fungovalo
na starom g++ je vlastne chyba, podla ISO C++ to fungovat nema. :)
Jednoduchym riesenim je zadat do 'std::endl' aj konkretne typove
parametre (je to totiz sablonova funkcia) Napr.:
re << "hello world" << std::endl<char, char_traits<char> >;
...no ale to nie je velmi pohodlne riesenie.
Druhe mozne riesenie je dodefinovat specialny
"operator<<" pre manipulatory. V nasom pripade to uz nesmie byt
sablona. Takze priklad:
------------------------------------
#include <iostream>
#include <iomanip>
using namespace std;
class Stream
{
public:
template<typename T_>
Stream& operator<< (const T_& t)
{
cout << t;
return *this;
}
Stream& operator<< (ostream& (*pf)(ostream&))
{
cout << pf;
return *this;
}
};
int main()
{
Stream myStream;
myStream << "Hello world!" << endl;
}
---------------------------------------
Uvedeny kod som odskusal na:
g++-2.96
g++-3.1.1
g++-3.2
Comeau-4.3.0.1
M$ VC++ 7.0
Borland C++ 5.5.1
a na vsetkych funguje bez problemov.
--
jozef kosoru [zyzstar] <zyzstar na uid0.sk>
Další informace o konferenci linux