2010-11-10 4 views
2

Et les deux classes sont les mêmes, par exemple:ne peut pas convertir namespace_something :: some_class à Some_Class

///////////////server.h////////////// 
#ifndef SERVER_H 
#define SERVER_H 

#ifdef WIN32 
     #ifndef _WIN32_WINNT 
       #define _WIN32_WINNT 0x0501 
     #endif 
#endif 
#include <boost/shared_ptr.hpp> 
#include <boost/asio.hpp> 
#include <map> 

#include "auxiliar.h" 

class Client; 

namespace Irc 
{ 
     typedef boost::shared_ptr<Client> ClientPtr; 
     typedef std::map<SocketPtr, ClientPtr> ClientsMap; 

     class Server 
     { 
       public: 
         Server(); 
         ~Server(); 

         void start(); 

         void startAccept(); 

         ClientsMap::const_iterator begin() { return m_clients.begin(); } 
         ClientsMap::const_iterator end() { return m_clients.end(); } 

       private: 
         ClientsMap m_clients; 
         boost::asio::io_service service; 
         boost::asio::ip::tcp::acceptor* m_acceptor; 
     }; 
} //namespace Irc 
#endif 
/////////////server.cpp//////////////// 
#include "server.h" 
#include "defines.h" 
#include "client.h" 

Irc::Server::Server() 
{ 
     service.run(); 
} 

Irc::Server::~Server() 
{ 
     m_clients.clear(); 
} 

void Irc::Server::start() 
{ 
     m_acceptor = new boost::asio::ip::tcp::acceptor(service, boost::asio::ip::tcp::endpoint(
       boost::asio::ip::tcp::v4(), SERVER_PORT)); 
} 

void Irc::Server::startAccept() 
{ 
     SocketPtr s(new boost::asio::ip::tcp::socket(service)); 
     m_acceptor->accept(*s); 
     Client *client = new Client(s); 
     client->setIoService(&service); 
     ClientPtr ptr(client); 
     m_clients.insert(std::make_pair(s, ptr)); 
} 

Cela produit l'erreur de compilation:

g++.exe -c src/server.cpp -o src/server.o -I"D:/Dev-Cpp/include" -g -ggdb -I"include" -fexpensive-optimizations -O1 D:/Dev-Cpp/include/boost/smart_ptr/shared_ptr.hpp: In constructor boost::shared_ptr< <template-parameter-1-1> >::shared_ptr(Y*) [with Y = Irc::Client, T = Client]': src/server.cpp:27: instantiated from here D:/Dev-Cpp/include/boost/smart_ptr/shared_ptr.hpp:179: error: cannot convert Irc::Client*' to `Client*' in initialization

+0

Quelle est l'erreur que vous obtenez? – vitaut

+0

Quel est le message d'erreur? Incluez-vous correctement les deux en-têtes dans le fichier .cpp? – log0

+0

Je ne peux pas reproduire l'erreur. – kennytm

Répondre

2

Vous devriez mettre la déclaration avant class Clientl'intérieur la espace de noms Irc.

namespace Irc { 
    class Client; // put it here. 
    ... 

Dans le cas contraire, le typedef du ClientPtr se réfère à la Client sans un espace de noms (car il est le plus proche déclaration de Client trouvée), pas le Irc::Client que vous voulez.

typedef boost::shared_ptr<Client> ClientPtr; 
+0

Exactement ce que j'étais sur le point de dire ... – chrisaycock

0

ou, mis à l'aide namespace_something;

mais, il est souhaitable de faire la kennytm façon dit

+0

toujours la même erreur. –

0

Vous voulez sans doute mettre la déclaration avant de Client à l'intérieur du namespace Irc dans server.h

namespace Irc { 
    class Client; 
    ... 
} 
+0

Pour confirmer cela. Vous pouvez nous montrer le contenu de 'client.h' – log0

Questions connexes