2017-04-07 91 views
0

編輯: @Holt幫我,解決的辦法是,如果hasCollided是非靜態的傳遞引擎的實例:C++擦除remove慣用法

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

我有它返回一個函數真或虛假磚塊是否被球擊中。

我想擦掉一個從矢量中擊中的磚。 我設法使用簡單的數字和布爾函數向量來處理成語,但是當我嘗試使用對象的向量時,我得到了奇怪的錯誤。

私有成員:

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

它吐了哪些錯誤呢? (請不要複製它們全部92個,但!) – hlt

+0

您可能想通過const引用傳遞參數。 – Jarod42

+2

'Engine :: hasCollided'' static'? (如果不是,你必須將其添加到綁定中)。 – Jarod42

回答

0

由於hasCollided是不是一個靜態的功能,你需要的Engine一個實例傳遞給std::bind

假設你正在做的擦/ Engine的方法內取出,則可以執行以下操作:

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',在這種情況下,您不需要將'this'傳遞給'std :: bind'。 – Holt