2016-09-14 70 views
0

我有这样的预定义的功能时谓词错误。的remove_if:使一个函数返回布尔

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

请编辑您的问题包含类似一般的功能[MCVE] – Slava

+0

您不能使用方法,你需要使用'的std :: bind' – Slava

+0

哪条线是发生在该错误? – Barmar

回答

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

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

  3. 当您使用范围for循环遍历它时,不要从容器中擦除对象。

  4. 将参数更改为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

你忘了施加伤害! – Borgleader

+0

@Borgleader,注意到我发布代码后。 –

+4

还有一个问题,从副本中删除对象 – Slava

0

isDead()是你的一个类的成员函数,这就是为什么它不工作:您没有提供this指针(对象它将被调用。哦,remove_if的谓词必须只有一个类型为objects::value_type的参数。

而是执行此操作:

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

此外,由于目前来写这个循环是O(N^2),因为如果是在循环中删除(这应该是在年底) – Borgleader

+0

@Borgleader:更糟糕的是,它会导致段错误。起初我没有注意到。 –

+0

谢谢!是的,我无法弄清楚创建谓词函数的方式。对C++来说非常新颖。 – Sam