I am trying to use boost::bind
and STL with boost::tuple
, but each time I try to compile I get the following error.
error: call of overloaded ‘bind(<unresolved overloaded function type>,
boost::arg<1>&)’ is ambiguous
Do you know what I am doing wrong here and why is only for the boost::arg<1>
?
Thanks AFG
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <boost/tuple/tuple.hpp>
#include <boost/assign.hpp>
#include <boost/bind.hpp>
int main( int argc, const char** argv ){
using namespace boost::assign;
typedef boost::tuple< int, double > eth_array;
std::vector< eth_array > v;
v+= boost::make_tuple( 10,23.4), boost::make_tuple( 12,24.4) );
std::for_each( v.begin()
, v.end()
, boost::bind<int>(
printf
, "%d-%f"
, boost::bind( eth_array::get<0>, _1 )
, boost::bind( eth_array::get<1>, _1 )
)
);
The
get
function has more than one template parameter: in addition to the index, it is also parameterized on the content of the tuple (the head and the tail of thecons
).Consequently,
get<0>
is not an instantiation of the template; you need to provide the additional arguments:However, this still won't work because
get
is overloaded (const and non-const version), so you need to explicitely state which overload you want. To do so, you need to use a function pointer with the correct type:Now you can use these function pointers in your bind expression:
As you can see, overloaded function templates and
bind
does not get along very well...Several problems here:
eth_array
not defined, I'm guessing that should be _array.Here you are trying to call the tuple as a function? Maybe you tried something like:
Finally, what seems to be causing the issue you described:
You should try using a function pointer instead of raw function name:
The complete body of main() that I got to compile and run: