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.