2017-04-07 3 views
0

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>)> >]'

+0

Welchen Fehler hat es ausspucken? (Bitte nicht alle 92 davon kopieren!) – hlt

+0

Wahrscheinlich wollen Sie das Argument const als Referenz übergeben. – Jarod42

+2

Ist 'Engine :: hasCollided' 'static'? (wenn Sie es nicht in der Bindung hinzufügen müssen). – Jarod42

Antwort

0

Da hasCollided ist eine keine statische Funktion, müssen Sie eine Instanz von Engine-std::bind passieren.

Angenommen, Sie den Lösch tun/innen ein Verfahren zur Herstellung Engine entfernen, können Sie wie folgt vorgehen:

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

Vielen Dank :) – daavid245

+0

Ich weiß, es ist spät, aber können Sie sagen, warum muss ich das Objekt an Std :: Bind übergeben? – daavid245

+0

@ daavid245 'Engine :: hasCollided' ist eine Methode, also arbeitet sie an einer Instanz des Objekts (' this'). Wenn Sie 'hasCollided' aufrufen wollen, benötigen Sie eine Instanz von' Engine', ansonsten haben Sie kein 'this' Objekt, mit dem Sie arbeiten können.Wenn Ihre 'hasCollided'-Funktion keine Mitglieder des 'this'-Objekts verwendet, sollte sie wahrscheinlich' static' sein. In diesem Fall müssen Sie 'this' nicht an' std :: bind' übergeben. – Holt