簡體   English   中英

C ++刪除對象成語

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM