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]

    http://www.boost.org/regression-logs/cs-win32_metacomm/doc/html/boost_tr1/usage.html#boost_tr1.include_style



  • 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 🙂


Anmelden zum Antworten