Funktionslokales struct kann nicht als Funktor verwendet werden
-
Jaja, ich weiß, es gibt jetzt in C++11 Lambdas für diesen Fall.
Aber der Code muss auf gcc 4.2 laufen, da gibts keinen C++11-Lambda-Support.Folgender code
void Foo::bar() { std::vector<Baz> bazzes; struct closure { bool operator()(const Baz& x) { return !x.isAwesome(); } } deleter; bazzes.erase(std::remove_if(bazzes.begin(), bazzes.end(), deleter), bazzes.end()); }Funktioniert nur, wenn ich das struct closure aus der Funktion herausziehe und in der Klasse deklariere. Wo es eigentlich nix zu suchen hat.
Funktionslokal bekomme ich eine Fehlermeldung:error: no matching function for call to 'remove_if(__gnu_cxx::__normal_iterator<Baz*, std::vector<Baz, std::allocator<Baz> > >, __gnu_cxx::__normal_iterator<Baz*, std::vector<Baz, std::allocator<Baz> > >, Foo::bar()::closure&)'ist das ein Bug oder ein Feature?
Gruß,
Philipp
-
Edit²: Versuch mal von
std::unary_function<Baz const&, bool>abzuleiten.
-
Weder Bug noch Feature, sondern streng standardkonform:
c++-98 Standard schrieb:
A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall not be used as a template-argument for a template type-parameter.
C++11 hat die Einschränkung nicht mehr, aber da hast du sowieso Lambdas.
-
Alternative:
bazzes.erase( std::remove_if(bazzes.begin(), bazzes.end(), !boost::bind(&Baz::isAwesome,_1)), bazzes.end() );(ungetestet)
-
@krümelkacker Wie soll denn der ! Operator da funktionieren?
-
-
