I implemented my own SocketAcceptor class, but I'm stuck on a compiler error I cannot figure out. The class is defined as follows:
- Code: Select all
class Node;
class ClientHandler;
//FIX: compiler error
template <>
ClientHandler* SocketAcceptor<ClientHandler>::createServiceHandler(StreamSocket& socket) {return 0;}
//End of compiler error fix
class ClientSocketAcceptor : public SocketAcceptor<ClientHandler> {
protected:
Node* fNode;
ClientHandler* createServiceHandler(StreamSocket&);
public:
ClientSocketAcceptor(ServerSocket&, SocketReactor&, Node*);
};
#endif /* CLIENTSOCKETACCEPTOR_H_ */
When I compile it without the compiler error fix, I get the following error:
- Code: Select all
Building node/ClientSocketAcceptor.cpp
external/include/Poco/Net/SocketAcceptor.h: In member function 'ServiceHandler* Poco::Net::SocketAcceptor<ServiceHandler>::createServiceHandler(Poco::Net::StreamSocket&) [with ServiceHandler = ClientHandler]':
external/include/Poco/Net/SocketAcceptor.h:144: instantiated from 'void Poco::Net::SocketAcceptor<ServiceHandler>::onAccept(Poco::Net::ReadableNotification*) [with ServiceHandler = ClientHandler]'
external/include/Poco/Net/SocketAcceptor.h:123: instantiated from 'void Poco::Net::SocketAcceptor<ServiceHandler>::registerAcceptor(Poco::Net::SocketReactor&) [with ServiceHandler = ClientHandler]'
external/include/Poco/Net/SocketAcceptor.h:105: instantiated from 'Poco::Net::SocketAcceptor<ServiceHandler>::SocketAcceptor(Poco::Net::ServerSocket&, Poco::Net::SocketReactor&) [with ServiceHandler = ClientHandler]'
src/node/ClientSocketAcceptor.cpp:10: instantiated from here
external/include/Poco/Net/SocketAcceptor.h:153: error: no matching function for call to 'ClientHandler::ClientHandler(Poco::Net::StreamSocket&, Poco::Net::SocketReactor&)'
src/node/ClientHandler.h:28: note: candidates are: ClientHandler::ClientHandler(Poco::Net::StreamSocket&, Poco::Net::SocketReactor&, Node*)
src/node/ClientHandler.h:26: note: ClientHandler::ClientHandler(const ClientHandler&)
make: *** [bin/node/ClientSocketAcceptor.o] Error 1
I noticed something with the createServiceHandler() method was wrong, so I used the above template definition to fix it. However, then I get the following error:
- Code: Select all
In file included from src/node/Node.h:16,
from src/runNode.cpp:8:
src/node/ClientSocketAcceptor.h:28: error: specialization of 'ServiceHandler* Poco::Net::SocketAcceptor<ServiceHandler>::createServiceHandler(Poco::Net::StreamSocket&) [with ServiceHandler = ClientHandler]' in different namespace
src/node/ClientSocketAcceptor.h:28: error: from definition of 'ServiceHandler* Poco::Net::SocketAcceptor<ServiceHandler>::createServiceHandler(Poco::Net::StreamSocket&) [with ServiceHandler = ClientHandler]'
make: *** [bin/runNode.o] Error 1
Placing the template definition in the same namespace Poco::Net gives me duplicate symbol (linker) errors..
Oh Yeah, my ClientHandler class is defined as follows:
- Code: Select all
blabla
class Node;
class ClientHandler {
public:
ClientHandler(StreamSocket&, SocketReactor&, Node*);
~ClientHandler();
void onReadable(const AutoPtr<ReadableNotification>& pNf);
void onShutdown(const AutoPtr<ShutdownNotification>& pNf);
private:
StreamSocket fSocket;
SocketReactor& fReactor;
Node* fNode;
};
Any ideas on how to fix this? It's a really weird error.. Or shouldn't I use the template definition and do something else?
Thanks..






