Initialisieren von Template Klassen



  • Ich habe eine Klasse...

    #ifndef SESSIONHANDLER_H_INCLUDED
    #define SESSIONHANDLER_H_INCLUDED
    
    #include <wx/socket.h>
    #include <wx/event.h>
    
    template<typename T> class SessionHandler: public wxThread
    {
        public:
            SessionHandler( T* sock );
            virtual void *Entry();
        private:
            T *m_sock;
    };
    
    template<typename T> SessionHandler<T>::SessionHandler( T* sock )
    {
        m_sock = sock;
    }
    
    template<typename T> void * SessionHandler<T>::Entry()
    {
        char c;
        const int max_bytes = 1;
    
        m_sock->SetFlags( wxSOCKET_WAITALL );
        while( m_sock->IsConnected() )
        {
            m_sock->Read( &c, max_bytes );
            m_sock->Write( &c, max_bytes );
        }
        return NULL;
    }
    
    #endif // SESSIONHANDLER_H_INCLUDED
    

    von der ich zwei Klassen...

    #ifndef CLIENTSESSION
    #define CLIENTSESSION
    
    #include "SessionHandler.h"
    
    class ClientSession : public SessionHandler<ClientSession>
    {
        public:
            ClientSession( wxSocketClient *client );
            virtual ~ClientSession();
        protected:
        private:
            wxSocketClient *m_client;
    };
    
    #endif // CLIENTSESSION
    

    und ...

    #ifndef SERVERSESSION
    #define SERVERSESSION
    
    #include "SessionHandler.h"
    
    class ServerSession: public SessionHandler<ServerSession>
    {
        public:
            ServerSession( wxSocketServer *server );
            virtual ~ServerSession();
        protected:
        private:
            wxSocketServer *m_server;
    };
    
    #endif // SERVERSESSION
    

    ableiten möchte. Aber wenn ich dann

    include "ClientSession.h"
    
    #include "TinyPeerApp.h"
    #include "SocketDocument.h"
    
    ClientSession::ClientSession( wxSocketClient* client )
    {
        m_client = client;
    }
    ...
    

    mache meckert der Compiler, dass

    no matching function for call to 'SessionHandler<ClientSession>::SessionHandler(wxSocketClient*&)'

    Wenn ich dann aber in der Initialisierung das mache..

    ClientSession::ClientSession( wxSocketClient* client ): SessionHandler<ClientSession>::SessionHandler( client )
    {
        m_client = client;
    }
    

    dann gibt es keine matching function.

    Wie kann ich das Problem lösen?



  • Na ist doch klar, es gibt keinen passenden Konstruktor.



  • Ja, schon! Aber das war nicht das Problem! In meiner "Variante" von vorhin war völlig der Wurm drin.
    Wenn man sich das mal ansieht dann fällt auf, das T == ClientSession oder T == ServerSession ist. Das haut nicht hin!

    Wenn aber in Serversession die Situation wie folgt aussieht

    #ifndef SERVERSESSION
    #define SERVERSESSION
    
    #include <wx/socket.h>
    #include "SessionHandler.h"
    
    class ServerSession : public SessionHandler<wxSocketServer>
    {
        public:
            ServerSession( wxSocketServer *server );
            virtual ~ServerSession(void);
        protected:
        private:
            wxSocketServer *m_server;
    };
    
    #endif // SERVERSESSION
    

    und in ClientSession

    #ifndef CLIENTSESSION
    #define CLIENTSESSION
    
    #include <wx/socket.h>
    #include "SessionHandler.h"
    
    class ClientSession : public SessionHandler<wxSocketClient>
    {
        public:
            ClientSession( wxSocketClient *client );
            virtual ~ClientSession(void);
        protected:
        private:
            wxSocketClient *m_client;
    };
    
    #endif // CLIENTSESSION
    

    Dann funktioniert...

    ServerSession::ServerSession( wxSocketServer *server ): SessionHandler<wxSocketServer>::SessionHandler( server )
    {
        m_server = server;
    }
    
    ServerSession::~ServerSession()
    {
        //dtor
    }
    

    und ...

    ClientSession::ClientSession( wxSocketClient *client ): SessionHandler<wxSocketClient>::SessionHandler( client )
    {
        m_client = client;
    }
    
    ClientSession::~ClientSession(void)
    {
        //dtor
    }
    

    Gruß



  • Das Problem ist, dass du dein eigenes Design nicht verstehst. SessionHandler ist doch kein CRTP. Es bildet offensichtlich einen Wrapper um einen Zeiger, den es als Template-Parameter bekommt.

    Uebrigens...

    mache meckert der Compiler, dass

    no matching function for call to 'SessionHandler<ClientSession>::SessionHandler(wxSocketClient*&)'

    Wenn ich dann aber in der Initialisierung das mache..

    ClientSession::ClientSession( wxSocketClient* client ): SessionHandler<ClientSession>::SessionHandler( client )
    {
    m_client = client;
    }
    

    dann gibt es keine matching function.

    Hier wird nicht klar, was du meinst. In beiden Faellen gibt es keine Funktion mit passender Signatur. Also "no matching function".
    Wieso also das "aber"?

    Noch zwei BTWs:

    • Bitte Initialisierungslisten im Ctor verwenden.

    ClientSession::ClientSession( wxSocketClient* client ): SessionHandler<ClientSession>::SessionHandler( client )
    {
    m_client = client;
    }

    
    Sollte eigentlich wohl so aussehen:  
    
    ```cpp
    ClientSession::ClientSession( wxSocketClient* client ): SessionHandler( client ) 
    { 
        m_client = client; 
    }
    

    FrankTheFox schrieb:

    Ja, schon! Aber das war nicht das Problem! In meiner "Variante" von vorhin war völlig der Wurm drin.
    Wenn man sich das mal ansieht dann fällt auf, das T == ClientSession oder T == ServerSession ist. Das haut nicht hin!

    Nein, wenn du dir den Code naeher ansiehst soll und kann es das auch nicht!

    FrankTheFox schrieb:

    Wenn aber in Serversession die Situation wie folgt aussieht

    #ifndef SERVERSESSION
    #define SERVERSESSION
    
    #include <wx/socket.h>
    #include "SessionHandler.h"
    
    class ServerSession : public SessionHandler<wxSocketServer>
    {
        public:
            ServerSession( wxSocketServer *server );
            virtual ~ServerSession(void);
        protected:
        private:
            wxSocketServer *m_server;
    };
    
    #endif // SERVERSESSION
    

    und in ClientSession

    #ifndef CLIENTSESSION
    #define CLIENTSESSION
    
    #include <wx/socket.h>
    #include "SessionHandler.h"
    
    class ClientSession : public SessionHandler<wxSocketClient>
    {
        public:
            ClientSession( wxSocketClient *client );
            virtual ~ClientSession(void);
        protected:
        private:
            wxSocketClient *m_client;
    };
    
    #endif // CLIENTSESSION
    

    Dann funktioniert...

    ServerSession::ServerSession( wxSocketServer *server ): SessionHandler<wxSocketServer>::SessionHandler( server )
    {
        m_server = server;
    }
    
    ServerSession::~ServerSession()
    {
        //dtor
    }
    

    und ...

    ClientSession::ClientSession( wxSocketClient *client ): SessionHandler<wxSocketClient>::SessionHandler( client )
    {
        m_client = client;
    }
    
    ClientSession::~ClientSession(void)
    {
        //dtor
    }
    

    Und genau so soll es doch sein 😕



  • Sone schrieb:

    Das Problem ist, dass du dein eigenes Design nicht verstehst. SessionHandler ist doch kein CRTP. Es bildet offensichtlich einen Wrapper um einen Zeiger, den es als Template-Parameter bekommt.

    Jupp! Hatte erst die Idee mit dem Wrapper, dann dachte ich mir doch keine so gute Idee. Jo und so nach wildem getippe hatte ich dann den vollkommen den Faden verloren und den dämlichen Fehler nicht gesehen.

    Sone schrieb:

    Und genau so soll es doch sein 😕

    Jo und genau so isses nu auch. 🙂


Anmelden zum Antworten