$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: rogeeff (rogeeff_at_[hidden])
Date: 2002-02-23 11:30:37
--- In boost_at_y..., Aleksey Gurtovoy <alexy_at_m...> wrote:
> David Abrahams wrote:
> > > But you still end up with the following ambiguity on MSVC:
> > >
> > > template<typename T>
> > > struct A {
> > > };
> > >
> > > template<typename T>
> > > void foo( T const& ) {}
> > >
> > > template<typename T>
> > > void foo( A<T> const& ) {}
> > >
> > > int main(int, char*[])
> > > {
> > >     A<int> a_int;
> > >
> > >     foo( a_int );
> > >
> > >     return 0;
> > > }
> > >
> > > error C2667: 'foo' : none of 2 overload have a best conversion
> > >
> > > Anyone knows a fix?
> > 
> > It depends whether 'A' is supposed to represent a 
> > user-defined type or a template supplied by the library. If the 
> > latter, you can intrude on foo and detect that T is an A<T> using 
> > the sizeof() trick, then dispatch as appropriate. Otherwise, I'm 
> > afraid there's no way.
> 
>     #include <iostream>
> 
>     template< typename T > struct A {};
> 
>     namespace aux {
>     template< typename T >
>     struct foo_impl
>     {
>         template< typename U >
>         static void foo(A<U> const&, long)
>         {
>             std::cout << "foo(A<U> const&)\n";
>         }
> 
>         static void foo(T const&, int)
>         {
>             std::cout << "foo(T const&)\n";
>         }
>     };
>     }
> 
>     template< typename T >
>     void foo(T const& t)
>     {
>         aux::foo_impl<T>::foo(t, 1L);
>     }
> 
>     int main()
>     {
>         foo(int());
>         foo(A<int>());
>         return 0;
>     }
> 
> That's more, I belive that the technique allows you to simulate 
partial
> ordering of any number of overloaded function templates, not just 2 
of them.
> 
> Aleksey
Could you explain how it is working ? What is the role of second 
argument? Why long/int? Why 1L? How to extend this technique for more 
then 2 cases.
Gennadiy.