2017-04-07 4 views
0

편집 :C++ 삭제-제거 관용구는

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

내가 반환하는 기능이 true 또는 : @Holt 내게 도움이 솔루션은 hasCollided이 아닌 정적 인 경우 엔진의 인스턴스를 전달하는 것입니다 벽돌이 공에 맞았는지 여부.

나는 벡터에서 떨어진 벽돌을 지우고 싶다. 숫자와 bool 함수의 간단한 벡터로 작업하는 관용구를 얻을 수 있었지만 객체의 벡터를 사용해도 이상한 오류가 발생했습니다.

개인 회원 :

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에 발생합니다

template<typename _Iterator> 
    bool 
    operator()(_Iterator __it) 
    { return bool(_M_pred(*__it)); } 
    }; 

그리고 컴파일러에서 92 개의 오류가 발생합니다. 내가 그

예 오류를 수정 도와주세요 : hasCollided 이후

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

이 아닌 정적 기능, 당신은 std::bindEngine의 인스턴스를 전달해야합니다.

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

대단히 감사합니다 :) – daavid245

+0

늦었지만 왜 객체를 std :: bind에 전달해야하는지 알 수 있습니까? – daavid245

+0

@ daavid245'Engine :: hasCollided'는 method이므로 객체의 인스턴스에서 작동합니다 ('this'). 'hasCollided'를 호출하고 싶다면'Engine' 인스턴스가 필요합니다. 그렇지 않으면'this' 객체가 없습니다.'hasCollided' 함수가'this' 객체의 멤버를 사용하지 않는다면'static'으로 만들어야합니다.이 경우'std :: bind'에'this'를 전달할 필요가 없습니다. – Holt

관련 문제