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

C++ remove_if:传递返回bool的函数时出现谓词错误,c++,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(object

我有这个预定义的函数

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());
    }
}
void攻击(std::vector对象,未签名伤害){
用于(游戏对象*对象:对象){
物品->损坏(损坏);
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; 
}
bool isDead()常量{
如果(被破坏){
标准::cout
  • isDead
    是函数中的一个变量。如果
    ,则不能将其用作
    删除\u的参数

  • 如果
  • ,则不能使用常规成员函数作为
    std::remove\u的参数。请改用lambda函数

  • 使用循环范围在容器上迭代时,不要从容器中删除对象

  • 将参数更改为
    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());
    }
    
    void攻击(std::vector&objects,未签名伤害)
    {
    用于(游戏对象*对象:对象)
    {
    物品->损坏(损坏);
    }
    objects.erase(std::remove_if(objects.begin(),objects.end(),[](GameObject*object){return object->isDead();}),objects.end());
    }
    
  • isDead
    是函数中的一个变量。如果
    ,则不能将其用作
    删除\u的参数

  • 如果
  • ,则不能使用常规成员函数作为
    std::remove\u的参数。请改用lambda函数

  • 使用循环范围在容器上迭代时,不要从容器中删除对象

  • 将参数更改为
    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());
    }
    
    void攻击(std::vector&objects,未签名伤害)
    {
    用于(游戏对象*对象:对象)
    {
    物品->损坏(损坏);
    }
    objects.erase(std::remove_if(objects.begin(),objects.end(),[](GameObject*object){return object->isDead();}),objects.end());
    }
    
    isDead()
    是一个类的成员函数,这正是它不起作用的原因:您没有提供
    这个
    指针(对象实例)来调用它。哦,
    remove\u if
    的谓词必须只有一个
    objects::value\u type
    类型的参数

    改为这样做:

    objects.erase(std::remove_if(objects.begin(),objects.end(),[](GameObject* object){return object->isDead()), objects.end());
    
    isDead()
    是您的一个类的成员函数,这正是它不起作用的原因:您没有提供
    这个
    指针(对象实例)来调用它。哦,
    remove\u if
    的谓词必须正好有一个
    objects::value\u type
    类型的参数

    改为这样做:

    objects.erase(std::remove_if(objects.begin(),objects.end(),[](GameObject* object){return object->isDead()), objects.end());
    


    请编辑您的问题,以包含一个您不能使用的方法,如您需要使用的常规函数。
    std::bind
    错误发生在哪一行?请提供。注意:我们不需要查看您的全部代码。@Slava如果这是真的,OP传递的是bool而不是实际的方法。(
    auto isDead=object->isDead();
    )请编辑您的问题,以包含一个您不能使用的方法,如您需要使用的常规函数。
    std::bind
    错误发生在哪一行?请提供。注意:我们不需要查看您的全部代码。@Slava如果这是真的,OP传递的是bool而不是实际的方法。(
    auto isDead=object->isDead();
    )此外,正如目前所写的,这个循环是O(n ^ 2),因为如果是在循环内(应该是在结尾)@ BGORADER:更糟的是,它会导致Sebug。我一开始没有注意到。谢谢!是的,我不能想出创建谓词函数的方法。对C++来说是非常新的。因为remove if位于循环内部(应该在末尾)“Borgleader:更糟糕的是,它会导致Sebug。我没有注意到。谢谢!是的,我无法想出创建谓词函数的方法。C++很新。你忘了应用损坏了!”博格达,在我发布代码后注意到了。还有一个问题,从一个拷贝感谢中删除对象。这确实是PROFL。em.我正试图传递一个变量!你忘了应用伤害!@Borgeader在我发布代码后注意到了这一点。还有一个问题,从副本中删除对象。谢谢。这确实是个问题。我正试图传递一个变量!