Boost STL转换不适用于BGL

Boost STL转换不适用于BGL,boost,stl,graph,Boost,Stl,Graph,我是BGL的新手。我正在尝试将一系列边转换为系统中可用的等效对象 std::vector<my_obj*> return_value(distance(all_edges.first, all_edges.second)); std::transform(all_edges.first, all_edges.second, return_value.begin(), bind(&graph::transform, this, _1)); 但

我是BGL的新手。我正在尝试将一系列边转换为系统中可用的等效对象

std::vector<my_obj*> return_value(distance(all_edges.first, all_edges.second));
std::transform(all_edges.first, all_edges.second, return_value.begin(),
               bind(&graph::transform, this, _1));  
但我遇到了一个我无法理解的错误:

/usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algo.h: In function `_OutputIterator std::transform(_InputIterator, _InputIterator, _OutputIterator, _UnaryOperation) [with _InputIterator =boost::detail::adj_list_edge_iterator<std::_List_iterator<void*>, boo        st::detail::out_edge_iter<std::_List_iterator<boost::detail::sep_<void*, boost::property<boost::        edge_bundle_t, my_obj*, boost::no_property> > >, void*, boost::detail::edge_desc_impl<boost::dir        ected_tag, void*>, ptrdiff_t>, boost::adjacency_list<boost::listS, boost::listS, boost::directed        S, my_obj*, my_obj*, boost::no_property, boost::listS> >, _OutputIterator = __gnu_cxx::__normal_        iterator<my_obj**, std::vector<my_obj*, std::allocator<my_obj*> > >, _UnaryOperation = boost::la        mbda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::action<3, boost::lambda::        function_action<3, boost::lambda::detail::unspecified> >,
      2    boost::tuples::tuple<my_obj*(Graph::*const)(boost::detail::edge_desc_impl<boost::directed_tag        , void*>), Graph* const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >,boo        st::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_t        ype,boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >]':
      3 Isrc/icn_graph.cxx:70:   instantiated from here
      4 /usr/lib/gcc/x86_64-redhat-linux/3.4.6/../../../../include/c++/3.4.6/bits/stl_algo.h:789: error:         no match for call to `(boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::        lambda::action<3, boost::lambda::function_action<3, boost::lambda::detail::unspecified> >, boost        ::tuples::tuple<my_obj*(Graph::*const)(boost::detail::edge_desc_impl<boost::directed_tag, void*>        ), Graph* const, const boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tup        les::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, bo        ost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type> > >) (boost::detail:        :edge_desc_impl<boost::directed_tag, void*>)'
      5 /usr/include/boost/lambda/detail/lambda_functors.hpp:137: note: candidates are: typename T::sig<        boost::tuples::null_type>::type boost::lambda::lambda_functor<Base>::operator()() const [with T        = boost::lambda::lambda_functor_base<boost::lambda::action<3, boost::lambda::function_action<3,        boost::lambda::detail::unspecified> >, boost::tuples::tuple<my_obj*(Graph::*const)(boost::detail        ::edge_desc_impl<boost::directed_tag, void*>), Graph* const, const boost::lambda::lambda_functor        <boost::lambda::placeholder<1> >, boost::tuples::null_type, boost::tuples::null_type, boost::tup        les::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, bo        ost::tuples::null_type> >]
      6 /usr/include/boost/lambda/detail/lambda_functors.hpp:145: note:                 typename T::sig<        boost::tuples::tuple<A&, 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::tupl        es::null_type, boost::tuples::null_type, boost::tuples::null_type> >::type boost::lambda::lambda        _functor<Base>::operator()(A&) const [with A = boost::detail::edge_desc_impl<boost::directed_tag        , void*>, T = boost::lambda::lambda_functor_base<boost::lambda::action<3, boost::lambda::functio        n_action<3, boost::lambda::detail::unspecified>>, boost::tuples::tuple<my_obj*(Graph::*const)(bo        ost::detail::edge_desc_impl<boost::directed_tag, void*>), Graph* const, const boost::lambda::lam        bda_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> >]
      7

为什么会出现此错误?

这里的所有边是什么?如果它来自edgesg,则迭代器的值类型是edge_描述符,而不是my_obj*。您需要应用一个不同的std::transform functor,该functor从描述符获取edge属性,然后将graph::transform应用于它。

对此我可能是错的,但我怀疑

bind(&graph::transform, this, _1)
是指一元函数,它接受this指针,然后对其调用graph::transform。如果是这样,不幸的是,这一行没有做你认为它做的。它将当前this指针作为参数绑定到graph::transform,然后返回一个函子将graph::transform应用到当前对象。我想你可能想要的是更符合

std::mem_fun(&graph::transform)
它实际上将graph::transform转换为一元函数,该函数使用给定成员函数的参数作为this指针来调用该成员函数。实际上,您可能想使用boost::mem_fn实现这一点,但我不是这方面的专家,也不会在这里尝试猜测正确答案-


如果我完全错误地理解了您的意图,请告诉我,我将删除此答案。

仅凭您提供的信息很难判断问题出在哪里。
您尝试绑定的graph::transform函数的签名是什么?

my_obj*graph::transformedge\u描述符我尝试将一系列边描述符转换为等效的my_obj*。我们有typedef std::pair Edge_范围;根据[boost documentation]boost.org/doc/libs/1_45_0/doc/html/lambda/…我可以将bind与成员函数一起使用,比如:bind&graph::transform,碰巧发布的两行在graph中的另一个成员函数中,所以bind表达式变成了:bindgraph::transform,这,\u 1