我正在尝试将boost::bind
和STL与boost::tuple
一起使用,但每次尝试编译时都会出现以下错误。
error: call of overloaded ‘bind(<unresolved overloaded function type>,
boost::arg<1>&)’ is ambiguous
你知道我在这里做错了什么,为什么只有boost::arg<1>
?
由于 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 )
)
);
答案 0 :(得分:8)
get
函数有多个模板参数:除索引外,还会对元组的内容(cons
的头部和尾部)进行参数化。
因此,get<0>
不是模板的实例化;你需要提供额外的参数:
typedef eth_array::head_type head;
typedef eth_array::tail_type tail;
... get<0, head, tail> ...
然而,由于get
被重载(const和非const版本),这仍然无效,因此您需要明确说明您想要的过载。为此,您需要使用具有正确类型的函数指针:
// const version of get, which takes and returns const references
int const & (*get0)( boost::tuples::cons<head, tail> const & ) =
boost::get<0, head, tail>;
double const & (*get1)( boost::tuples::cons<head, tail> const & ) =
boost::get<1, head, tail>;
现在您可以在绑定表达式中使用这些函数指针:
std::for_each( v.begin(),
v.end(),
boost::bind<int>(
printf,
"%d-%f",
boost::bind( get0, _1 ),
boost::bind( get1, _1 )
)
);
// outputs 10-23.40000012-24.400000
正如您所看到的,重载的功能模板和bind
相处得并不好......
答案 1 :(得分:1)
这里有几个问题:
eth_array
未定义,我猜这应该是_array。
v+= ( boost::make_tuple( 10,23.4) )( boost::make_tuple( 12,24.4) );
在这里你试图将元组称为函数?也许你尝试过类似的东西:
v+=boost::make_tuple( 10,23.4);
v+=boost::make_tuple( 12,24.4);
最后,似乎导致了您所描述的问题:
boost::bind( eth_array::get<0>, _1 )
您应该尝试使用函数指针而不是原始函数名称:
boost::bind( ð_array::get<0>, _1 )
我编译并运行的main()的完整主体:
int main( int argc, const char** argv ){
using namespace boost::assign;
typedef boost::tuple< int, double > _array;
std::vector< _array > v;
v+=boost::make_tuple( 10,23.4);
v+=boost::make_tuple( 12,24.4);
std::for_each( v.begin()
, v.end()
, boost::bind<int>(
printf
, "%d-%f\n"
, boost::bind( &_array::get<0>, _1 )
, boost::bind( &_array::get<1>, _1 )
)
);
}