Re: Problems with endl
Richard Howard wrote:
I am trying to write a wrapper around an ostream
[...]
class DebugStream
{
[...]
template <class T>
DebugStream & operator << (T const & t)
[...]
};
Which was fine until I tried to use endl with it
int main()
{
DebugStream ds(std::cout);
ds << "see me" << std::endl; // problem
}
using VC8 I get the following complaints regarding problem line
error C2914: 'DebugStream::operator <<' : cannot deduce template
argument as function argument is ambiguous
error C2676: binary '<<' : 'DebugStream' does not define this operator
or a conversion to a type acceptable to the predefined operator
Could somebody please explain what I have got wrong.
'endl' is a function:
std::ostream& endl(std::ostream&);
Together with an output operator for functions (well, actually function
pointers) of this type, the newline insertion is implemented. However, and
that is your problem, endl is actually the name of multiple, overloaded
functions:
std::ostream& endl(std::ostream&);
std::wostream& endl(std::wostream&);
Now, in your wrapper case, there is no hint which of the two should be
selected, since both fit perfectly. In order to fix this, you could either
select one of them (using a static_cast to the according function pointer
type) or you simply provide an overload to your operator<<:
DebugStream& operator<<(std::ostream& (*pfn)(std::ostream&));
HTH
Uli
--
Sator Laser GmbH
Gesch??ftsf??hrer: Thorsten F??cking, Amtsgericht Hamburg HR B62 932
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]