2010-11-10 1 views
2

И оба класса такие же, пример:не может преобразовать 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)); 
} 

Это дает ошибку компиляции:

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

Какую ошибку вы получаете? – vitaut

+0

Какое сообщение об ошибке? Правильно ли вы включаете оба заголовка в файл .cpp? – log0

+0

Я не могу воспроизвести ошибку. – kennytm

ответ

2

Вы должны положить вперед декларацию class Clientвнутри в пространство имен Irc.

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

В противном случае, ЬурейеЕ в ClientPtr будет со ссылкой на Client без имен (так как он является ближайшим декларирование Client найден), а не Irc::Client вы хотите.

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

Точно, что я собирался сказать ... – chrisaycock

0

или, положить использованием namespace_something;

, но, желательно, чтобы сделать путь kennytm сказал

+0

все та же ошибка. – 2010-11-10 17:30:20

0

Вы, вероятно, хотите, чтобы положить вперед декларацию Client внутри namespace Irc в server.h

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

Чтобы это подтвердить. Вы можете показать нам содержимое 'client.h' – log0

Смежные вопросы