remove_if:传递返回bool的函数时出现谓词错误

时间:2016-09-14 17:00:53

标签: c++

我有这个预定义的功能。

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)); }

2 个答案:

答案 0 :(得分:5)

  1. isDead是函数中的变量。您不能将其用作remove_if的参数。

  2. 您也不能使用常规成员函数作为std::remove_if的参数。请改用lambda函数。

  3. 使用循环范围迭代时,不要从容器中删除对象。

  4. 将参数更改为attack作为参考。否则,您将从副本中删除对象,而不是原始容器。

  5. 这是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());