2017-04-07 94 views
0

编辑: @Holt帮我,解决的办法是,如果hasCollided是非静态的传递引擎的实例:C++擦除remove惯用法

std::bind(&Engine::hasCollided, this, ball, _1); 

我有它返回一个函数真或虚假砖块是否被球击中。

我想擦掉一个从矢量中击中的砖。 我设法使用简单的数字和布尔函数向量来处理成语,但是当我尝试使用对象的向量时,我得到了奇怪的错误。

私有成员:

Ball ball; 
std::vector<Brick> bricks; 

碰撞检查:

bool Engine::hasCollided(Ball& object1, Brick& object2) 
{ 
    //do some checks 
    return 1; 
} 

我尝试:

using namespace std::placeholders; 

auto f = std::bind(hasCollided, ball, _1); 
bricks.erase(std::remove_if(bricks.begin(), bricks.end(), f), bricks.end()); 

错误发生在predefined_ops.h就在这里:

​​

编译器吐出92个错误。请帮我解决这个问题

实例错误:

required from '_ForwardIterator std::__remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Game::Brick*, std::vector<Game::Brick> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<std::_Bind<std::_Mem_fn<bool (Game::Engine::*)(Game::Ball&, Game::Brick&)>(Game::Ball, std::_Placeholder<1>)> >]'

+0

它吐了哪些错误呢? (请不要复制它们全部92个,但!) – hlt

+0

您可能想通过const引用传递参数。 – Jarod42

+2

'Engine :: hasCollided'' static'? (如果不是,你必须将其添加到绑定中)。 – Jarod42

回答

0

由于hasCollided是不是一个静态的功能,你需要的Engine一个实例传递给std::bind

假设你正在做的擦/ Engine的方法内取出,则可以执行以下操作:

auto f = std::bind(&Engine::hasCollided, this, ball, _1); 
//          ^^^^ 
+0

非常感谢你:) – daavid245

+0

我知道它晚了,但你能告诉我为什么需要传递对象到std :: bind吗? – daavid245

+0

@ daavid245'Engine :: hasCollided'是方法,所以它在对象的实例('this')上工作。如果你想调用'hasCollided',你需要一个'Engine'的实例,否则你没有'this'对象可以使用。如果'hasCollided'函数不使用'this'对象的成员,那么它可能应该是'static',在这种情况下,您不需要将'this'传递给'std :: bind'。 – Holt