Frage zu Funktoren (eilig)
-
Hi!
Hab mir das Beispiel http://www.c-plusplus.net/forum/viewtopic.php?t=70473&highlight=funktor angesehen
und es ausprobiert .. geht aber nicht! Ich bekomm die Compilerfehlermeldung:
"set' : 'vergleichsFunktion' is invalid as template argument '#2', type expected"mein code
bool vergleichsFunktion(const string& a, const string& b) { return a < b; } ... main() { set<string,vergleichsFunktion>::iterator dictiter; set<string,vergleichsFunktion> dict; }
wieso das? die Parameter sind vom richtigen Typ .. warum motzt der?
danke!
-
vergleichsFunktion ist eine Funktion, kein Typ. Versuchs mal mit
class vergleichsFunktor { public: bool operator()(string const &a, string const &b) { return a < b; } };
-
Versuche mal
struct VergleichsFunktor { bool operator()(const string& a, const string& b) { return a < b; } };
template<class _Key, class _Compare, class _Alloc> class std::set;
-
1. std::set benutzt automatisch std::less und damit den operator< von std::string. Es ist also nicht notwendig in diesem Fall einen eigenen Funktor anzugeben.
2. Als template Parameter musst du einen Type angeben und keine Funktion. Deshalb muss eine solche Funktion gewrappt werden:
class VergleichsFunktor : public binary_function<string const &, string const &, bool> { public: bool operator()(const string& a, const string& b) { return a < b; } }
-
hm, also ist die Funktion die da in dem anderen Thread vorgeschlagen wird, falsch?
-
blackwinged schrieb:
hm, also ist die Funktion die da in dem anderen Thread vorgeschlagen wird, falsch?
Nö. Du musst nur richtig lesen. In dem zitierten Thread schrieb ich im letzten Beitrag:
Nein. Der dritte Parameter muss ein *Typ* sein. Also so:
map<Foo, t_serverdata, bool(*)(const Foo&, const Foo&)> m2(vergleichsFunktion);
Wie du siehst kannst du auch eine Funktion verwenden. Das erfordert zwei Dinge:
* du musst den *Typ* der Funktion bei der Spezialisierung des Containers angeben
* du musst die konkrete Funktion (also den Wert für den Typ) an den Konstruktor des Containers übergeben.
-
HumeSikkins schrieb:
blackwinged schrieb:
hm, also ist die Funktion die da in dem anderen Thread vorgeschlagen wird, falsch?
Nö. Du musst nur richtig lesen. In dem zitierten Thread schrieb ich im letzten Beitrag:
Nein. Der dritte Parameter muss ein *Typ* sein. Also so:
map<Foo, t_serverdata, bool(*)(const Foo&, const Foo&)> m2(vergleichsFunktion);
Wie du siehst kannst du auch eine Funktion verwenden. Das erfordert zwei Dinge:
* du musst den *Typ* der Funktion bei der Spezialisierung des Containers angeben
* du musst die konkrete Funktion (also den Wert für den Typ) an den Konstruktor des Containers übergeben.jo stimmt! danke!!