Mekrwürdiger Lambda Error
-
Hallo,
ich habe einen merkwürdigen Fehler, den ich leider nicht erklären kann (daher auch der unpräzise Titel). Ich werde einfach mal meinen Code posten, die Fehlermeldung und ne Beschreibung, was mein Ziel ist:
typedef void (*ReceiveProc)(const char*, int); //Prototype of the recv-function: void UdpServer::recv(ReceiveProc recvProc) // when data is received, the recvProc function is called and the received message and the bytes are transmitted int main() { UdpServer server(1234); // port 1234 server.start(); server.recv([&server] (const char* message, int bytes) { // diese Lambda-Funktion wird anscheinend als UdpServer::recv(main()::<lambda(psy::Net::Connection*, const char*, int)>) interpretiert server.send("Deine Nachricht ist angekommen :)"); MessageBox(GetForegroundWindow(), message, "", MB_OK); }); return 0; }Hier die Fehlermeldungen:
C:\Users\psylence\Desktop\C++\Pandorum\server\main.cpp||In function 'int main()':| C:\Users\psylence\Desktop\C++\Pandorum\server\main.cpp|31|error: no matching function for call to 'psy::Net::UdpServer::recv(main()::<lambda(psy::Net::Connection*, const char*, int)>)'| C:\Users\psylence\Desktop\C++\Pandorum\server\main.cpp|31|note: candidate is:| c:\program files\codeblocks\mingw\bin\..\lib\gcc\i686-pc-mingw32\4.7.0\..\..\..\..\include\psy\UdpServer.h|74|note: void psy::Net::UdpServer::recv(psy::Net::ReceiveProc)| c:\program files\codeblocks\mingw\bin\..\lib\gcc\i686-pc-mingw32\4.7.0\..\..\..\..\include\psy\UdpServer.h|74|note: no known conversion for argument 1 from 'main()::<lambda(psy::Net::Connection*, const char*, int)>' to 'psy::Net::ReceiveProc {aka void (*)(psy::Net::Connection*, const char*, int)}'| ||=== Build finished: 1 errors, 0 warnings (0 minutes, 2 seconds) ===|Ich habe Code auskommentiert und entfernt, um dem Fehler auf die Schliche zu kommen und es liegt am übergeben der Referenz des UdpServer-Objekts via [&server].
Danke im Voraus
-
So wie ich das sehe, wird Dein Lambda-Ausdruck nicht in einen Funktionszeiger konvertiert.
C++11 5.1.2/6 schrieb:
The closure type for a lambda-expression with no lambda-capture has a public non-virtual non-explicit const conversion function to pointer to function having the same parameter and return types as the closure type’s function call operator. The value returned by this conversion function shall be the address of a function that, when invoked, has the same effect as invoking the closure type’s function call operator.
Tschöö mit ö!
-
Okayy, das klingt überaus logisch.
Gibt's da irgendne Möglichkeit, mit der es trotzdem möglich ist, was ich vorhabe (also die server-Referenz per [] zu übergeben)?
Vielleicht mit einer anderen recv(...) Deklaration. Und was müsste dann in den Klammern stehen?
-
std::function<void(char const*, int)>
-
Oder auch
class server { // ... template <class F> void recv(F f) { // ... } };
-
error: 'std::function' has not been declared

Was muss ich includen?
-
http://en.cppreference.com/mwiki/index.php?title=Special%3ASearch&search=std%3A%3Afunction&button=
HTH
-
213456789olmnb schrieb:
Was muss ich includen?
<functional>
-
DerCoder schrieb:
Gibt's da irgendne Möglichkeit, mit der es trotzdem möglich ist, was ich vorhabe (also die server-Referenz per [] zu übergeben)?
Vielleicht mit einer anderen recv(...) Deklaration. Und was müsste dann in den Klammern stehen?
Da gibt's ne ganze Menge Möglichkeiten. Und die C++igsten hast du hier schon gesehen. In C würde man der Funktion noch einen extra Parameter spendieren, worüber man einen "Zustand" oder "Kontext" transportieren/referenzieren kann, typischerweise ist das ein void-Zeiger:
typedef void (*Callback)(const char*, int, void*); void c_funktion(void* user_data, Callback cb) { cb("test",42,user_data); } int main() { int faktor = 3; c_function(&faktor,[](const char* msg, int i, void* context){ int& faktor = *static_cast<int*>(context); cout << msg << faktor*i << endl; }); return 0; }Nicht, dass das jetzt super toll wäre, aber es ist sicherlich auch nicht ganz uninteressant, wenn man mit der einen oder anderen C-API zu tun hat, oder eine C-API selbst anbieten muss.
-
typedef void (*ReceiveProc)(const char*, int); //Prototype of the recv-function: void UdpServer::recv(ReceiveProc recvProc) // when data is received, the recvProc function is called and the received message and the bytes are transmitted int main() { UdpServer server(1234); // port 1234 server.start(); server.recv([&server] (const char* message, int bytes) { // diese Lambda-Funktion wird anscheinend als UdpServer::recv(main()::<lambda(psy::Net::Connection*, const char*, int)>) interpretiert server.send("Deine Nachricht ist angekommen :)"); //// hier war die Klammerung falsch MessageBox(GetForegroundWindow(), message, "", MB_OK); }); return 0; }Sollte das nicht:
typedef void (*ReceiveProc)(const char*, int); //Prototype of the recv-function: void UdpServer::recv(ReceiveProc recvProc) // when data is received, the recvProc function is called and the received message and the bytes are transmitted int main() { UdpServer server(1234); // port 1234 server.start(); server.recv([&server] (const char* message, int bytes) { server.send("Deine Nachricht ist angekommen :")}); MessageBox(GetForegroundWindow(), message, "", MB_OK); }); return 0; }sein (also die runde Klammer hinter die Anführungstriche und eine geschweifte Klammer dahinter)?
-
Danke .