MAKRO Problem:



  • Hallo Leute,

    ich habe ein Problem, weiß aber überhaupt nicht wie ich das angehen könnte:) ich verwendet ein Lib (Crow Webserver)

    damit "erstelle" einen websocket:

    int main()
    {
        crow::SimpleApp app;
    
     // Klappt 
       CROW_WEBSOCKET_ROUTE(app, "/viewer").onopen(....);
    
      //Kappt nicht
      CrownBackend  x(app);
    
    ...
    
    server->port(18080).run(); 
    };
    

    nunm öchste ich aber en Websocket in einer Klasse kappseln, und gebe der Klasse
    die web-server instanz mit will im c-tor:

    class CrownBackend 
    {
    public:
    
        CrownBackend(crow::SimpleApp& backend) 
        {
                //Hier compilerfehler
                CROW_WEBSOCKET_ROUTE(backend, "/ws").onopen(...)
    ...
    }
    }
    

    und bekomme den Fehler:

    Schweregrad	Code	Beschreibung	Projekt	Datei	Zeile	Unterdrückungszustand
    Fehler (aktiv)	E0304	Keine Instanz von Funktionsvorlage "crow::TaggedRule<Args...>::websocket [mit Args=<>]" stimmt mit der Argumentliste überein.	UiBackend	...\UiBackend.cpp	132	
    
    Fehler	C2672	"crow::RuleParameterTraits<crow::TaggedRule<>>::websocket": keine übereinstimmende überladene Funktion gefunden	UiBackend	...\UiBackend.cpp	132	
    
    Fehler	C2770	Ungültige explizite Vorlage-Argumente für „crow::WebSocketRule<App> &crow::RuleParameterTraits<crow::TaggedRule<>>::websocket(App *)“.	UiBackend	...\UiBackend.cpp	132
    

    das steckt im Makro:

    #define CROW_WEBSOCKET_ROUTE(app, url) app.route<crow::black_magic::get_parameter_tag(url)>(url).websocket<decltype(app)>(&app)
    

    Ist vll. bissel viel verlang euch damit zu beschäftigen.. aber vll. seht ihr gleich was;)

    Danke und Schönes WE schonmal



  • Moin,

    ist das Beispiel minimal? Der Code der nicht geht ist ja etwas anders als der Code der scheinbar geht. Unter anderem sieht das onOpen(...) bisschen komisch aus. Die Methode heißt ja onopen und hast du ja auch schon davor verwendet.
    Ich sehe aber natürlich nicht, wo jetzt deine Zeile 132 ist 😉

    Ansonsten: Die Autoren helfen auch immer gerne -> https://gitter.im/crowfork/community. Einfach mit Matrix Client der Wahl (Gitter, Element etc.) joinen und Frage stellen. Hilfe kommt immer schnell.



  • @Leon0402 sagte in MAKRO Problem::

    Moin,
    ist das Beispiel minimal? Der Code der nicht geht ist ja etwas anders als der Code der scheinbar geht. Unter anderem sieht das onOpen(...) bisschen komisch aus. Die Methode heißt ja onopen und hast du ja auch schon davor verwendet.
    Ich sehe aber natürlich nicht, wo jetzt deine Zeile 132 ist
    Ansonsten: Die Autoren helfen auch immer gerne -> https://gitter.im/crowfork/community. Einfach mit Matrix Client der Wahl (Gitter, Element etc.) joinen und Frage stellen. Hilfe kommt immer schnell.

    servus Leon,

    sorry habe es gerade editiert.. muss natürlich "onopen" heißen. Also so sieht die Geschichte (pseudo) aus. Das genannte Makro funktioniert nicht wenn ich versuche es in einer anderen Instanz aufzurufen in der "SimpleApp" instanziiert wurde.!?



  • Ich denke, es liegt an der Referenz (von crow::SimpleApp& backend) bei decltype(app).

    Erstelle mal ein neues Makro (und benutze es dann):

    #define CROW_WEBSOCKET_ROUTE_NOREF(app, url) app.route<crow::black_magic::get_parameter_tag(url)>(url).websocket<std::remove_reference_t<decltype(app)>>(&app)
    

    (sofern du mind. C++14 verwendest, bei C++11 std::remove_reference<decltype(app)>::type)

    Edit: Eigentlich sollte das Makro auch besser als Template-Funktion umgesetzt sein.



  • @Th69 sagte in MAKRO Problem::

    Ich denke, es liegt an der Referenz (von crow::SimpleApp& backend) bei decltype(app).

    Guten Morgen ,

    Hammer vielen Dank , genau das war es:) Wenn ich Zeit finde, würde ich das gern verstehen was da passiert. Aber Top 🙂

    Ich Danke dir;)

    Und danke Leon:)


Anmelden zum Antworten