Wieso ist dieser funktionsaufruf mehrdeutig?
-
Also, ich habe folgenden Code.
class Observer { public: void addObserver(const std::tr1::function<void(const std::tr1::tuple<int,int>&)>& functor) { } void addObserver(const std::tr1::function<void(const int&,const int&)>& functor) { } }; ... Observer test; std::tr1::function<void(int,int)> foo=... test.addObserver(foo);Eigentlich sollte es ja keine Probleme geben, da die funktionen unterschiedlich lange parameterlisten haben, aber wenn ich den code compiliere bekomme ich folgenden Fehler:
main.cpp:104: error: call of overloaded `addObserver(boost::function<void ()(int, int), std::allocator<void> >)' is ambiguous
Event.hpp:221: note: candidates are: void utility::Observer::addObserver(const boost::function<void ()(const boost::fusion::tuple<int, int, boost::fusion::void_t, boost::fusion::void_t, boost::fusion::void_t, boost::fusion::void_t, boost::fusion::void_t, boost::fusion::void_t, boost::fusion::void_t, boost::fusion::void_t>&), std::allocator<void> >&)
Event.hpp:224: note: void utility::Observer::addObserver(const boost::function<void ()(const int&, const int&), std::allocator<void> >&)Ich kann mir da leider keinen reim drauf machen, habt ihr vielleicht ne idee, woran das liegt?
//edit ich nutze den gcc der dem Code::Blocks beiliegt
-
Du hast keine Überladung für ein function<void(int,int)>, sondern nur für function<void(const int&,const int&)> - und selbst wenn die Umwandlung von int nach 'const int&' besser ist als von int nach tupel, stehen selbstdefinierte Typumwandlungen alle auf der gleichen Stufe (und die Umwandlung von function<x> nach function<y> ist eine selbstdefinierte Umwandlung), dadurch sind die notwendigen Typumwandlungen für beide Methodenaufrufe gleich gut.
-
@otze: Wie hast du tr1 in C::B bekommen oder benutzt du tr1 von boost und hast es nur in std gepackt ?
Ahh, ok habs im Error gesehen

-
KasF schrieb:
benutzt du tr1 von boost und hast es nur in std gepackt ? [sic]
-
CStoll schrieb:
Du hast keine Überladung für ein function<void(int,int)>, sondern nur für function<void(const int&,const int&)> - und selbst wenn die Umwandlung von int nach 'const int&' besser ist als von int nach tupel, stehen selbstdefinierte Typumwandlungen alle auf der gleichen Stufe (und die Umwandlung von function<x> nach function<y> ist eine selbstdefinierte Umwandlung), dadurch sind die notwendigen Typumwandlungen für beide Methodenaufrufe gleich gut.
so betrachtet ist das logisch. danke dir für die Antwort
