> -----Original Message-----
> From: Peter Dimov [mailto:[EMAIL PROTECTED] 
> Sent: Wednesday, June 18, 2003 6:43 AM
> To: Boost mailing list
> Subject: Re: [boost] test_tools_test Metrowerks failure
> 
> 
> Gennadiy Rozental wrote:
> > Hi,
> >
> > I am having problems with subject test with Metrowerks 
> compiler. I was 
> > able to minimize the issue to the following snippet: #include <list>
> > #include <iostream>
> >
> > template<typename T>
> > inline void
> > print( std::ostream& ostr, T const& t, long ) { ostr << t; }
> >
> > template<typename T>
> > inline void
> > moo( std::ostream& ostr, T const& t ) { print( ostr, t, 0 ); }
> >
> > inline void
> > print( std::ostream& ostr, std::list<int> const& t, int ) {}
> >
> > void foo()
> > {
> >     std::list<int> lst;
> >
> >     print( std::cout, lst, 0 );  //1
> >     moo( std::cout, lst );      //2
> > }
> >
> > Line 1 compile successfully, while line 2 chokes.
> >
> > Any Ideas?
> 
> Yes, the code is broken. moo doesn't see the second overload. 
> Templates do argument-dependent lookup from the point of 
> instantiation, and since the only namespace associated with 
> the 'print(ostr, t, 0)' call is 'std', the second print is 
> not found. 

All above symbols in fact are in a some namespace. It does not have a
difference (if that what you mean)

> You need to move it before the definition of moo 
> (or place it in std:: which is oddly evil but right.)

No. this wouldn't work for me.

In fact I found the solution (I think):

#include <list>
#include <iostream>

/////////////////////////////////////////////
// Library code

template<typename T>
struct printer {
void
operator()( std::ostream& ostr, T const& t )
{ ostr << t; }
};

template<typename T>
inline void
moo( std::ostream& ostr, T const& t ) { printer<T>()( ostr, t ); }

/////////////////////////////////////////////
// Users specialization

template<>
struct printer<std::list<int> > {
void
operator()( std::ostream& ostr, std::list<int> const& t )
{}
};

/////////////////////////////////////////////
// Usage code

void foo()
{
    std::list<int> lst;

    moo( std::cout, lst );      //2
}

Above works with online Cameau. Seems strange that PS and overloading works
different.

Gennadiy.
_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to