2016-09-14 9 views
0

私はこの定義済みの関数を持っています。remove_if:boolを返す関数を渡すときの述語エラー

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

あなたは 'そのエラーがで起こっている行のstd :: bind' – Slava

+0

あなたが使用することはできません方法を含むようにあなたの質問を編集してください? – Slava

+0

を使用する必要がある一般的な機能のような[MCVE] – Barmar

答えて

5
  1. isDead関数で可変です。 remove_ifの引数として使用することはできません。

  2. 通常のメンバー関数をstd::remove_ifの引数として使用することはできません。代わりにラムダ関数を使用してください。

  3. ループの範囲を使用して反復処理中にコンテナからオブジェクトを消去しないでください。

  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のまさに1つの引数が必要です。

代わりにこれを行います。

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

また、このループはO(N^2)です。なぜなら、ループ内にifがあるからです(最後にあるはずです)。 – Borgleader

+0

@Borgleader:悪いことに、segfaultが発生します。私は最初に気付かなかった。 –

+0

ありがとうございます!はい、私は述語関数を作成する方法を理解できませんでした。 C++の新機能 – Sam

関連する問題