我有这个for循环:
std::vector<itemPtr>::iterator it;
for(it=items.begin(); it!=items.end(); ++it)
{
investigators.addToLeaderInventory(*it);
}
Run Code Online (Sandbox Code Playgroud)
我想把它转换成这样的东西:
std::for_each(items.begin(), items.end(), investigators.addToLeaderInventory);
Run Code Online (Sandbox Code Playgroud)
但是,该行无法编译.g ++告诉我这个:
error: no matching function for call to
‘for_each(__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<yarl::item::Item>*,
std::vector<std::tr1::shared_ptr<yarl::item::Item>,
std::allocator<std::tr1::shared_ptr<yarl::item::Item> > > >,
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<yarl::item::Item>*,
std::vector<std::tr1::shared_ptr<yarl::item::Item>,
std::allocator<std::tr1::shared_ptr<yarl::item::Item> > > >, <unresolved overloaded
function type>)’
/usr/include/c++/4.4/bits/stl_algo.h:4194: note: candidates are: _Funct
std::for_each(_IIter, _IIter, _Funct) [with _IIter =
__gnu_cxx::__normal_iterator<std::tr1::shared_ptr<yarl::item::Item>*,
std::vector<std::tr1::shared_ptr<yarl::item::Item>,
std::allocator<std::tr1::shared_ptr<yarl::item::Item> > > >, _Funct = void
(yarl::party::Party::*)(yarl::itemPtr)]
Run Code Online (Sandbox Code Playgroud)
至少可以说,难以阅读.我想解决方案非常简单,但我无法弄清楚g ++在抱怨什么.签名investigators.addToLeaderInventory()
是这样的:
void ClassName::addToLeaderInventory(itemPtr item);
Run Code Online (Sandbox Code Playgroud)
哪个应该合作for_each
,不应该吗?我应该改变什么?
for_each
采用某种可调用的实体.为了在另一个对象上调用成员函数,您需要使用mem_fun
,它包装成员函数以便可以像普通函数一样调用它,然后您需要将它绑定到应该使用它调用它的对象实例bind1st
:
std::for_each(items.begin(), items.end(),
std::bind1st(std::mem_fun(&ClassName::add), &investigators));
Run Code Online (Sandbox Code Playgroud)
另一个选择是使用更现代的bind
,你的实现可以在std
或std::tr1
命名空间中提供(如果没有,你可以使用Boost的实现):
using std::placeholders::_1;
std::for_each(items.begin(), items.end(),
std::bind(&ClassName::add, &investigators, _1);
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3706 次 |
最近记录: |