2017-04-07 6 views
0

編集でイディオムを消去、削除: @Holtが私を助けて、解決策はhasCollidedは非静的であればエンジンのインスタンスを渡すことです:C++オブジェクト

std::bind(&Engine::hasCollided, this, ball, _1); 

私がtrueを返したかの機能を持っていますレンガがボールに当たったかどうかは間違いです。

ベクトルからヒットしたレンガを消去したいと思います。 単純なベクトルの数とブール関数を使ってイディオムを扱うことができましたが、オブジェクトのベクトルで同じことをしようとすると、私は奇妙なエラーに遭遇します。

プライベートメンバー:

Ball ball; 
std::vector<Brick> bricks; 

衝突チェック:

bool Engine::hasCollided(Ball& object1, Brick& object2) 
{ 
    //do some checks 
    return 1; 
} 

私の試み:

using namespace std::placeholders; 

auto f = std::bind(hasCollided, ball, _1); 
bricks.erase(std::remove_if(bricks.begin(), bricks.end(), f), bricks.end()); 

エラーはここpredefined_ops.hで起こる:

​​

コンパイラは92個のエラーを吐き出します。

required from '_ForwardIterator std::__remove_if(_ForwardIterator, _ForwardIterator, _Predicate) [with _ForwardIterator = __gnu_cxx::__normal_iterator<Game::Brick*, std::vector<Game::Brick> >; _Predicate = __gnu_cxx::__ops::_Iter_pred<std::_Bind<std::_Mem_fn<bool (Game::Engine::*)(Game::Ball&, Game::Brick&)>(Game::Ball, std::_Placeholder<1>)> >]'

+0

それが吐き出すんどのエラー:

あなたは消去を行っていると仮定/ Engineのメソッド内で削除し、次のことができますか? (しかし、それらの92個全てをコピーしないでください!) – hlt

+0

おそらく、const参照で引数を渡したいと思うかもしれません。 – Jarod42

+2

'Engine :: hasCollided'は' static'ですか? (そうでない場合は、バインディングに追加する必要はありません)。 – Jarod42

答えて

0

hasCollidedが静的​​関数ではないので、あなたがstd::bindEngineのインスタンスを渡す必要があります:私は

例のエラーことを修正する助けてください。

auto f = std::bind(&Engine::hasCollided, this, ball, _1); 
//          ^^^^ 
+0

ありがとうございました:) – daavid245

+0

私はそれが遅れていることを知っていますが、なぜオブジェクトをstd :: bindに渡す必要があるのでしょうか? – daavid245

+0

@ daavid245 'Engine :: hasCollided'はメソッドなので、オブジェクト(' this')のインスタンスで動作します。 'hasCollided'を呼び出す場合は、' Engine'のインスタンスが必要です。そうでなければ、 'this'オブジェクトがありません。あなたの 'hasCollided'関数が' this'オブジェクトのメンバを使用していない場合は 'static'にする必要があります。この場合' std :: bind'に 'this'を渡す必要はありません。 – Holt