[英]C++ Erase-remove idiom with object
編輯: @Holt幫助我,解決方案是如果hasCollided是非靜態的,則傳遞Engine的實例:
std::bind(&Engine::hasCollided, this, ball, _1);
我有一個函數,無論磚是被球擊中,它都會返回true或false。
我想擦除從向量中撞到的磚。 我設法使這個成語與簡單的數字向量和布爾函數一起工作,但是當我嘗試對對象向量進行相同操作時會遇到奇怪的錯誤。
私人會員:
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
_ops.h中發生錯誤:
template<typename _Iterator>
bool
operator()(_Iterator __it)
{ return bool(_M_pred(*__it)); }
};
並且編譯器吐出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>)> >]'
由於hasCollided
不是一個靜態函數,因此您需要將Engine
的實例傳遞給std::bind
。
假設您正在Engine
的方法中進行擦除/刪除,則可以執行以下操作:
auto f = std::bind(&Engine::hasCollided, this, ball, _1);
// ^^^^
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.