Adressübergabe einer Memberfunktion



  • Hier:

    int message::connect_member(std::function<void()>& slot){
    

    Warum hast du hier eine (non-const) Referenz auf eine std::function?



  • Warum ist eine const Ref. auf std:function erforderlch ?

    Wie müsste diese schreiben?

    // message.h
    int connect_member(std::function<void()> const& slot);
    
    // message.cpp
    int message::connect_member(std::function<void()> const& slot)
    {
    slots_.insert(std::make_pair(++current_id_, slot));
        return current_id_;
    }
    


  • Der Rückgabetyp paßt nicht überein: void <-> int



  • ok der Rückgabetyp war falsch - habe nun

    void message::listen() definiert
    

    leider kommt immer noch folgende Fehlermeldung:
    ..\sender_receiver\main.cpp: In function 'int main()':
    ..\sender_receiver\main.cpp:13:44: error: no matching function for call to 'message::connect_member(main()::<lambda()>&)'
    int id = bob._say.connect_member(listen);
    ^
    In file included from ..\sender_receiver\sender.h:4:0,
    from ..\sender_receiver\main.cpp:2:
    ..\sender_receiver\message.h:13:9: note: candidate: int message::connect_member(std::function<void()>&)
    int connect_member(std::function<void()> & slot);
    ^
    DIESE FEHLERMELDUNG DÜRFTE AM AUSSAGEFRÄFTIGSTEN SEIN:
    ..\sender_receiver\message.h:13:9: note: no known conversion for argument 1 from 'main()::<lambda()>' to 'std::function<void()>&'

    //message.cpp
    int message::connect_member(std::function<void()> & slot){
    
        slots_.insert(std::make_pair(++current_id_, slot));
        return current_id_;
    }
    
    // receiver.h
    class receiver
    {
    public:
        receiver();
        message _say;
        void listen();
    };
    
    //main
    int main()
    {
        sender bob;
        receiver alice;
    
        auto listen = [&](){ alice.listen(); };
        int id = bob._say.connect_member(listen);
    
        return id;
    }
    


  • int message::connect_member(std::function<void()>  slot)
    


  • Nun kommt eine Templatefehlermeldung !?!?

    ..\sender_receiver\message.cpp:9:45: error: template argument 1 is invalid
    int message::connect_member(std::function<()> slot){


  • Mod

    Suchspiel: Finde den Unterschied!

    schnebe schrieb:

    int message::connect_member(std::function<()> slot)
    

    manni66 schrieb:

    int message::connect_member(std::function<void()>  slot)
    


  • Danke Manni - tut!

    Ich nehme an daß der &-Operator in der "connect_member" entfällt , da durch die Bindung [&] bereits eine Referenz zurück gegeben wird.



  • schnebe schrieb:

    Ich nehme an daß der &-Operator in der "connect_member" entfällt , da durch die Bindung [&] bereits eine Referenz zurück gegeben wird.

    Solltest du das & an std::function meinen: Nein! Eine std::function kann ein Lambda entgegennehmen, ein Lambda ist aber keine std::function.



  • Ok!
    Bin mittlerweile auch bei der Lambdafunktion schlauer geworden durch gute Beispiele. Ich muß es jetzt "nur" für meinen Anwendungsfall umsetzen.

    Nochmal Danke an alle!


Anmelden zum Antworten