Subject: Re: [boost] Boost::Lambda + Boost::Tuple + unresolved overloaded function type
From: Steven Watanabe (watanabesj_at_[hidden])
Date: 2009-05-13 12:31:10


AMDG

Dmitry V. Krivenok wrote:
> bll::bind(boost::make_tuple<int*, bool>, &bll::_1,
> true));
> ////////////////////////////////////////////////////////////////
>
> It doesn't compile:
>
> $ g++-4.3.2 -I /usr/local/dev/boost-1.38.0/include/ main2.cpp
> main2.cpp: In function 'int main()':
> main2.cpp:22: error: no matching function for call to
> 'bind(<unresolved overloaded function type>, const
> boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::other_action<boost::lambda::addressof_action>,
> boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1>
> >, boost::tuples::null_type, boost::tuples::null_type,
> boost::tuples::null_type, boost::tuples::null_type,
> boost::tuples::null_type, boost::tuples::null_type,
> boost::tuples::null_type, boost::tuples::null_type,
> boost::tuples::null_type> > >, bool)'
> $
>
> What's wrong in the second program?

* make_tuple is overloaded for more than 2 arguments.
* When taking the address of a function template, the compiler can
  try to deduce template parameters based on the required signature. for
example,
  static_cast<boost::tuple<int*, bool, char> >(*)(const int*&, const
bool&, const char&)>(&boost::make_tuple<int*, bool>)
  is legal and will yield a different overload of make_tuple than the
one that you intend.
* bind is a function template so it doesn't provide enough information
to resolve
    the ambiguity.

In Christ,
Steven Watanabe