Problem: boost::function mit std::set
-
Hi,
ich weiß nicht warum der folgende Code nicht funktioniert.
Falls ich comp verwende funktioniert es, falls ich die boost::bind im zusammenhang mit der Klassenfunktion verwende nicht, ich weiß aber nicht wieso denn die Signatur müsste eigentlich stimmen.#include "stdafx.h" #include <boost/function.hpp> #include <boost/bind.hpp> #include <string> #include <set> using namespace boost; using namespace std; class test { public: test() {}; string str; bool compare(test b) { return str<b.str; } }; struct comp { bool operator() (const test a, const test b) { return a.str>b.str;} }; int _tmain(int argc, _TCHAR* argv[]) { boost::function<bool (test , test)> compfunc; compfunc=&test::compare; set< test, compfunc > B; //set<test,comp> B; test ta; ta.str="blubb"; test tb; tb.str="bla"; cout << "---" << compfunc(ta,tb) <<"\n"; cout << "---" << compfunc(tb,ta) <<"\n"; cin.get(); return 0; }Das ganze ergibt folgende Fehlermeldung:
testprj2.cpp(42) : error C2923: 'std::set': 'compfunc' ist als Vorlagenargument '#2' ungültig, Typ erwartet testprj2.cpp(39): Siehe Deklaration von 'compfunc'Kennt hier jemand die Lösung dieses Problems.
(operator überladen oder so iss klar, aber wie geht es so?)MFG
mamue110
-
[quote="mamue110"]
boost::function<bool (test , test)> compfunc;
compfunc=&test::compare;
[/cpp]Der Template-Parametertyp stimmt schonmal nicht mit der Signatur von test::compare überein.
-
das passt schon.
bei boost::function<bool (test , test)> wird das erste Argunemt als das Objekt und das zweite als Funktionsargument verwendet. Das habe ich mit
compfunc(ta,tb), was ta.compare(tb) entspricht, getestet.
-
boost::function<bool (test , test)> compfunc;
'compfunc' ist als Vorlagenargument '#2' ungültig, Typ erwartet
ist compfunc ein Typ?
-
Hmm, schon merkwürdig, dass implizit zu Test* konvertiert wird, aber gut... mal was anderes: Du parametrisiert den Compare-Typ deiner std::set mit einer Variablen... sprich richtig wäre:
typedef boost::function<bool (test , test)> compfunc; set< test, compfunc > B;Edit: Anwendung
typedef boost::function<bool (test , test)> compfunc; compfunc f =&test::compare; set< test, compfunc > B(f);
-
Ich versteh nich genau was du damit meinst, jedenfalls compiliert das nicht.
Mein Problem:
std::set erwartet als ersten Template-Parameter den Datentypen und als optionalen zweiten Templateparameter eine vergleichsfunktion. Diese muss der Signatur bool (datentyp, datentyp), in meinem Fall also bool (test,test) entsprechen.
Erstelle ich mein Funktionsobjekt selbst (siehe struct comp) geht das ganze ohne Probleme. Wenn ich jedoch das Funktionsobjekt über boost Function erstelle geht es nicht. Wenn man die beiden verwendet sehen sie genau gleich aus:comp(ta,tb) compfunc(ta,tb)und beide geben einen boolean zurück.
Was ich nicht verstehe ist dass set<test,comp> compiliert, set< test, compfunc > jedoch nicht.
-
mamue110 schrieb:
Was ich nicht verstehe ist dass set<test,comp> compiliert, set< test, compfunc > jedoch nicht.
compfunc ist eine VARIABLE und kein TYP!
-
Ok,
jetzt hats klick gemacht. Ich weiß jetzt aber immernoch nicht wie ich das ganze jetzt verwenden soll
typedef boost::function<bool (test , test)> sig; sig compfunc; compfunc=&test::compare; set< test, sig > B;...compiliert zwar, kann aber nicht wirklich verwendet werden (bringt bei zweitem Insert, also wenn er zum ersten mal sortieren will, einen Laufzeitfehler).
-
Schau dir mal die std::set Konstruktoren an

-
so, nach etwas code-lesen habe ich es zwar nicht über den Konstruktor hinbekommen aber es läuft....
typedef boost::function<bool (test , test)> sig; sig compfunc; compfunc=&test::compare; set< test, sig > B; B.comp=compfunc;
-
mamue110 schrieb:
set< test, sig > B; B.comp=compfunc;Das kannst du einfacher haben:
set< test, sig > B(compfunc);Das meint ich mit, schau dir mal die Konstruktoren an.
Was mich wundert, wie kannst du nachträglich noch die Compare-Funktion zuweisen???
EDIT: Ah, alles klar. Die Visual C++ Implementation der STL erlaubt einen öffentlichen Zugriff... Das verletzt doch dann die Integrität
