Boost logo

Boost :

From: David Abrahams (dave_at_[hidden])
Date: 2003-06-18 06:05:43


"Gennadiy Rozental" <gennadiy.rozental_at_[hidden]> writes:

> 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?

Please always post the error message you get when reporting such a
bug.

### mwcc Compiler:
# File: foo.cpp
# ----------------
# 6: print( ostream & ostr, T const & t, long ) { ostr << t; }
# Error: ^
# illegal operands 'ostream' << 'const list<int>'
# (point of instantiation: 'main()')
# (instantiating: 'print<list<int> >(ostream &, const list<int> &, long)')

line 1 chooses the 2nd overload for print via partial ordering, but
line2 chooses the 1st overload due to something having to do with
2-phase name lookup, since on only the overloads visible at the point
of definition seem to be eligible. That contradicts my understanding
of 2-phase lookup, because print is clearly a dependent name, but
Comeau online agrees with Metrowerks here. Maybe someone else can
fill in the rest of the details.

> Gennadiy.
>
> P.S. Rest of Windows compilers I have access to seems to be happy with
> above.

None of them implement 2-phase lookup.

-- 
Dave Abrahams
Boost Consulting
www.boost-consulting.com

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk