|
Boost : |
From: Christopher Currie (christopher_at_[hidden])
Date: 2003-11-21 11:55:40
Peter Dimov wrote:
> That's odd. This is the line that fails:
>
> BOOST_TEST( bind(&X::hash, _1)(x) == 23558 );
>
> and the error message seems to indicate that the overload
>
> template<class F, class A1>
> _bi::bind_t<_bi::unspecified, F, typename _bi::list_av_1<A1>::type>
> BOOST_BIND(F f, A1 a1)
>
> is (incorrectly) preferred over
>
> template<class R, class T, class A1>
> _bi::bind_t< R const &, _mfi::dm<R, T>, typename _bi::list_av_1<A1>::type >
> BOOST_BIND(R T::*f, A1 a1)
That helps. Here's the test case that makes it fail:
struct unspecified {};
template<class R> class bind_t { };
template<class R, class F>
bind_t<R>
bind(F f);
template<class F>
bind_t<unspecified>
bind(F f);
template<class R, class T>
bind_t<R const &>
bind(R T::* pm)
{
return bind_t<R const &>();
}
struct X { int i; };
int main() { bind(&X::i); }
The Sun compiler is selecting the first partial specialization over the
second. If I comment out the first specialization, the code compiles
fine, but for some reason it thinks the first is a better match, so it
won't link.
Is this something we can work around, or is this something the user will
just have to deal with? I can specify "bind<int, X>(&X::i)" in main, and
it will compile.
Christopher
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk