Edit: @Holt hat mir geholfen, die Lösung ist eine Instanz von Motor zu übergeben, wenn hasCollided ist nicht statisch:C++ Erase-remove Idiom mit dem Objekt
std::bind(&Engine::hasCollided, this, ball, _1);
Ich habe eine Funktion, die true zurückgibt oder falsch, ob ein Stein von einem Ball getroffen wird.
Ich möchte einen Ziegelstein löschen, der vom Vektor geschlagen wurde. Ich habe es geschafft, das Idiom arbeiten mit einfachen Vektor der Zahlen und eine Bool-Funktion, aber ich bekomme seltsame Fehler, wenn ich das gleiche mit Vektor der Objekte versuchen.
Privat Mitglieder:
Ball ball;
std::vector<Brick> bricks;
Kollisionsprüfung:
bool Engine::hasCollided(Ball& object1, Brick& object2)
{
//do some checks
return 1;
}
Mein Versuch:
using namespace std::placeholders;
auto f = std::bind(hasCollided, ball, _1);
bricks.erase(std::remove_if(bricks.begin(), bricks.end(), f), bricks.end());
Fehler passiert im predefined_ops.h
hier:
template<typename _Iterator>
bool
operator()(_Iterator __it)
{ return bool(_M_pred(*__it)); }
};
Und der Compiler spuckt 92 Fehler aus. Bitte helfen Sie mir, dass
Beispiel Fehler zu beheben:
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>)> >]'
Welchen Fehler hat es ausspucken? (Bitte nicht alle 92 davon kopieren!) – hlt
Wahrscheinlich wollen Sie das Argument const als Referenz übergeben. – Jarod42
Ist 'Engine :: hasCollided' 'static'? (wenn Sie es nicht in der Bindung hinzufügen müssen). – Jarod42