我有这个预定义的功能。
void attack(std::vector<GameObject*> objects, unsigned damage) {
for (GameObject* object : objects) {
object->takeDamage(damage);
auto isDead = object->isDead();
objects.erase(std::remove_if(objects.begin(),objects.end(),isDead), objects.end());
}
}
这是我的isDead函数
bool isDead() const {
if (destructed) {
std::cout << "memory error" << std::endl;
}
return life <= 0;
}
这是我一直在犯的错误。已经尝试了很多东西,但根本没有能够解决这个问题。任何帮助表示赞赏!
错误:表达式不能用作函数 {return bool(_M_pred(* __ it)); }
答案 0 :(得分:5)
isDead
是函数中的变量。您不能将其用作remove_if
的参数。
您也不能使用常规成员函数作为std::remove_if
的参数。请改用lambda函数。
使用循环范围迭代时,不要从容器中删除对象。
将参数更改为attack
作为参考。否则,您将从副本中删除对象,而不是原始容器。
这是attack
的更新版本:
void attack(std::vector<GameObject*>& objects, unsigned damage)
{
for (GameObject* object : objects)
{
object->takeDamage(damage);
}
objects.erase(std::remove_if(objects.begin(),objects.end(), [](GameObject* object){return object->isDead();}), objects.end());
}
答案 1 :(得分:0)
isDead()
是你的某个类的成员函数,这正是它无法工作的原因:你没有提供this
指针(对象实例)来调用它。哦,remove_if
的谓词必须只有objects::value_type
类型的一个参数。
请改为:
objects.erase(std::remove_if(objects.begin(),objects.end(),[](GameObject* object){return object->isDead()), objects.end());