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){
-
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!