[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