2011-11-16 100 views
1

我想创建一个异步。服务器。 我成功地做到了这一点,但现在我想将async_read/asyn_write函数绑定到调用者对象函数。所以我试图做到这一点与升压::功能 在这里你有我的代码:使用异步函数提升asio编译错误

Server.cpp

#include "Server.h" 
#include "Client.h" 
#include "Network.h" 

void  Server::accept(void) 
{ 
    Network::ptr connection = Network::create(this->my_acceptor.get_io_service()); 
    this->my_acceptor.async_accept(connection->getSocket(), bind(&Server::endCmd, this, connection, placeholders::error)); 
} 

void  Server::endCmd(Network::ptr connection, const boost::system::error_code& error) 
{ 
    if (!error) 
     { 
      std::cout << "Recu un client!" << std::endl; 
      this->client.push_back(new Client(connection)); 
      this->client[client.size() - 1]->checkAuthentification(); 
      std::cout << "Envoie du message de securisation" << std::endl; 
      std::cout << "Nouvelle ecoute" << std::endl; 
      this->accept(); 
     } 
} 

Client.h和.cpp

#include "Network.h" 

class Client 
{ 
private: 
    Network::ptr connection; 

public: 
    Client(Network::ptr); 
    ~Client(); 
    void   checkAuthentification(void); 
    void   endRead(const error_code& error, size_t nbytes); 
    void   endWrite(const error_code &error); 
}; 

#include "Client.h" 

Client::Client(Network::ptr connect) 
{ 
    this->connection = connect; 
    this->connection->assignFunction(this); 
} 

Client::~Client() 
{ 
    this->connection->close(); 
} 

void   Client::checkAuthentification(void) 
{ 
    this->connection->Swrite("BIENVENUE", this); 
} 

void   Client::endRead(const error_code& error, size_t nbytes) 
{ 
    if (!error && nbytes != 0) 
     { 
      std::cout << this->connection->getRcvMsg() << std::endl; 
      this->connection->Sread(this); 
     } 
    else 
     this->connection->close(); 
} 

void   Client::endWrite(const error_code &error) 
{ 
    if (!error) 
     this->connection->Sread(this); 
    else 
     this->connection->close(); 
} 

和Network.cpp和.h

#include "Client.h" 

class  Network : public boost::enable_shared_from_this<Network> 
{ 
private: 
    tcp::socket    socket; 
    std::string    rcv_msg; 
    std::string    msg; 
    boost::array<char, 6> rbuffer; 
    boost::function<void (Client *, const error_code &, size_t)> fread; 
    boost::function<void (Client *, const error_code &)> fwrite; 

public: 
    typedef boost::shared_ptr<Network> ptr; 

    Network(io_service &); 
    ~Network(); 
    void    assignFunction(void); 
    void    close(void); 
    void    Sread(Client *cli); 
    void    Swrite(std::string msg, Client *cli); 
    tcp::socket&  getSocket(void); 
    std::string   getRcvMsg(void); 
    static ptr   create(io_service &); 
}; 

#include "Client.h" 
#include "Network.h" 

Network::Network(io_service &ios) : socket(ios) 
{ 
} 

Network::~Network() 
{ 
    this->close(); 
} 

void   Network::assignFunction(void) 
{ 
    this->fread = &Client::endRead; 
    this->fwrite = &Client::endWrite; 
} 

void   Network::close(void) 
{ 
    if (this->socket.is_open()) 
    { 
     std::cout << "Connection closed" << std::endl; 
     this->socket.close(); 
    } 
} 

void  Network::Sread(Client *cli) 
{ 
    async_read(this->socket, buffer(this->rbuffer), bind(&Network::fread, cli, placeholders::error, placeholders::bytes_transferred)); 
} 


void   Network::Swrite(std::string msg, Client *cli) 
{ 
    this->msg = msg; 
    async_write(this->socket, buffer(this->msg, (int)this->msg.size()), bind(&Network::fwrite, cli, placeholders::error)); 
} 

std::string  Network::getRcvMsg(void) 
{ 
    return (std::string(this->rbuffer.c_array(), this->rbuffer.size())); 
} 

tcp::socket& Network::getSocket(void) 
{ 
    return (this->socket); 
} 

Network::ptr    Network::create(io_service &ios) 
{ 
    return (ptr(new Network(ios))); 
} 

当我想编译时,我有以下错误:

Client.h(10): error C2653: 'Network' : is not a class or namespace name 
    Client.h(10): error C2146: syntax error : missing ';' before identifier 'connection' 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2460: 'Client::ptr' : uses 'Client', which is being defined 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(6): error C2511: 'Client::Client(Network::ptr)' : overloaded member function not found in 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(13): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(13): error C2227: left of '->close' must point to class/struct/union/generic type 
    1>Client.cpp(18): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(18): error C2227: left of '->Swrite' must point to class/struct/union/generic type 
    1>Client.cpp(25): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(25): error C2227: left of '->getRcvMsg' must point to class/struct/union/generic type 
    1>Client.cpp(26): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(26): error C2227: left of '->Sread' must point to class/struct/union/generic type 
    1>Client.cpp(29): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(29): error C2227: left of '->close' must point to class/struct/union/generic type 
    1>Client.cpp(35): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(35): error C2227: left of '->Sread' must point to class/struct/union/generic type 
    1>Client.cpp(37): error C2039: 'connection' : is not a member of 'Client' 
       Client.h(8) : see declaration of 'Client' 
    1>Client.cpp(37): error C2227: left of '->close' must point to class/struct/union/generic type 
     Commande.cpp 
     main.cpp 
    Client.h(10): error C2653: 'Network' : is not a class or namespace name 
    Client.h(10): error C2146: syntax error : missing ';' before identifier 'connection' 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2460: 'Client::ptr' : uses 'Client', which is being defined 
       Client.h(8) : see declaration of 'Client' 
     My_exception.cpp 
     Network.cpp 
    Network.h(14): error C2065: 'Client' : undeclared identifier 
    Network.h(14): error C2059: syntax error : ',' 
    Network.h(15): error C2065: 'Client' : undeclared identifier 
    Network.h(15): error C2059: syntax error : ',' 
    Network.h(25): error C2065: 'Client' : undeclared identifier 
    Network.h(25): error C2065: 'cli' : undeclared identifier 
    Network.h(25): error C2143: syntax error : missing ',' before ')' 
    Network.h(29): error C2143: syntax error : missing ';' before '}' 
    Client.h(8): error C2143: syntax error : missing ';' before '{' 
    Client.h(18): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(6): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(7): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(10): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(12): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(15): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(16): error C2653: 'Client' : is not a class or namespace name 
    1>Network.cpp(17): error C2653: 'Client' : is not a class or namespace name 
    1>Network.cpp(18): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(21): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(23): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(26): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(27): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(30): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(31): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>Network.cpp(31): error C2227: left of '->rbuffer' must point to class/struct/union/generic type 
    1>Network.cpp(31): error C2065: 'cli' : undeclared identifier 
    1>Network.cpp(31): error C2143: syntax error : missing ',' before ')' 
    1>Network.cpp(32): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(35): error C2065: 'Client' : undeclared identifier 
    1>Network.cpp(35): error C2065: 'cli' : undeclared identifier 
    1>Network.cpp(35): error C2143: syntax error : missing ',' before ')' 
    1>Network.cpp(36): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(38): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>Network.cpp(38): error C2227: left of '->msg' must point to class/struct/union/generic type 
    1>Network.cpp(38): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>Network.cpp(38): error C2227: left of '->msg' must point to class/struct/union/generic type 
    1>Network.cpp(38): error C2228: left of '.size' must have class/struct/union 
    1>Network.cpp(38): error C2065: 'cli' : undeclared identifier 
    1>Network.cpp(38): error C2143: syntax error : missing ',' before ')' 
    1>Network.cpp(39): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(42): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(43): error C2355: 'this' : can only be referenced inside non-static member functions 
    1>Network.cpp(43): error C2227: left of '->rbuffer' must point to class/struct/union/generic type 
    1>Network.cpp(43): error C2228: left of '.size' must have class/struct/union 
    1>Network.cpp(43): error C2143: syntax error : missing ',' before ')' 
    1>Network.cpp(44): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(47): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(49): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(52): error C2143: syntax error : missing ';' before '{' 
    1>Network.cpp(54): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(55): error C2143: syntax error : missing ';' before '}' 
    1>Network.cpp(55): fatal error C1004: unexpected end-of-file found 
     Server.cpp 
    Client.h(10): error C2653: 'Network' : is not a class or namespace name 
    Client.h(10): error C2146: syntax error : missing ';' before identifier 'connection' 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(10): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2653: 'Network' : is not a class or namespace name 
    Client.h(13): error C2460: 'Client::ptr' : uses 'Client', which is being defined 
       Client.h(8) : see declaration of 'Client' 
    1>Server.cpp(22): error C2664: 'Client::Client(const Client &)' : cannot convert parameter 1 from 'Network::ptr' to 'const Client &' 
       Reason: cannot convert from 'Network::ptr' to 'const Client' 
       No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called 

经过这么多小时的“googlings”和反思,我没有找到为什么我有这些错误。 任何人都可以帮助我吗?

回答

1

在Network.h,不包括Client.h,但而不是forward declareclass Client

+0

是的,它的工作,我删除了#include“Client.h”并添加了“客户端类”。我还有其他错误,但我会尽力单独解决这些问题。谢谢 –

+0

没问题,很高兴我能帮到你。 –

2

嗯..也许你已经离开了出来,但你没有包括标题:

编辑这似乎是显而易见的。如果不是那么
编辑2请注意,这些建议是在没有给出有关包含结构的完整信息时输入的。该问题已经得到解决,但这些提示是好的一般故障排除建议每当奇怪的问题与编译器不“看到”你的声明出现:

  • 检查编译头设置(禁用它们,例如)
  • 检查你接头,包括警卫(如果它们不正确,如

    #ifndef __NETWORK_H 
    #define __NETWORK_H 
    
    ... 
    #endif // __NETWORK_H 
    
    在Client.h

    ...

  • 检查的名称空间问题

    • 在命名空间
    • 包括Network.h从namespace { ... }
  • 检查预处理器的问题(#define小号肆虐?)

Server中意外宣布网络。 cpp

include "Network.h" 
include "Server.h" 

//.... 

Client.cpp

include "Network.h" 
include "Server.h" 

网络。CPP

include "Network.h" 

,可能(形式看错误):

Client.h

include "Network.h" 

+0

不,不,我删除它显示我的代码 –

+0

现在增加了更多的想法。顺便说一下,既然你删除了它们,那么我们真的没有什么可以看到的。正如你可能知道的那样,编译器不知道关于这些标识符的任何信息。这是非常重要的。 – sehe

+0

我在我的主题上添加了所有包含的内容 –