2012-07-30 118 views
0

我正在学习使用Boost ASIO。这里是我的代码改编自Boost doc的chat exampleAsio :: async_connect和io_service.run不编译

class AsioCommunicationService { 
AsioCommunicationService::AsioCommunicationService(
     boost::asio::io_service& io_service, 
     tcp::resolver::iterator endpoint_iterator) 
    : io_service_(io_service), 
     socket_(io_service) 
{ 
    boost::asio::async_connect(socket_, endpoint_iterator, 
     boost::bind(&AsioCommunicationService::handle_connect, this, 
     boost::asio::placeholders::error)); 
} 



void AsioCommunicationService::handle_connect(const boost::system::error_code& error) 
{ 
    if (!error) 
    { 
     boost::asio::async_read(socket_, 
      boost::asio::buffer(read_msg_.data(), LampMessage::header_length), 
      boost::bind(&AsioCommunicationService::handle_read_header, this, 
      boost::asio::placeholders::error)); 
    } 
} 
} 


class Connection 
{ 
    m_session = std::shared_ptr<AsioCommunicationService>(
      new AsioCommunicationService(io_service, iterator)); 
    boost::thread t(boost::bind(&boost::asio::io_service::run, &io_service)); 
} 

编译时,我得到一个错误,说'async_connect'不是'boost :: asio'的成员。显然,async_connect不是boost asio的成员,而是socket的成员,就IDE所告诉我的而言。我正在使用libasiodev 1.41.3。

我试图修改调用此

tcp::endpoint endpoint = *endpoint_iterator; 
socket_.async_connect(endpoint, 
    boost::bind(&AsioCommunicationService::handle_connect, this, 
    boost::asio::placeholders::error, ++endpoint_iterator)); 
//Got this error: instantiated from ‘boost::_bi::bind_t<boost::_bi::unspecified, void (networkService::AsioCommunicationService::*)(const boost::system::error_code&), boost::_bi::list3<boost::_bi::value<networkService::AsioCommunicationService*>, boost::arg<1> (*)(), boost::_bi::value<boost::asio::ip::basic_resolver_iterator<boost::asio::ip::tcp> > > >’ 

UPDATE: 改变handle_connect签名,包括迭代器参数后,我成功地编译该行。然而,编译器现在停留在包括以thread.hpp

#include <boost/thread.hpp> 
//ERROR: In function ‘boost::thread&& boost::move(boost::thread&&)’: 
///usr/include/boost/thread/detail/thread.hpp:349:16: error: invalid initialization of reference of type ‘boost::thread&&’ from expression of type ‘boost::thread’ 
//In file included from /usr/include/boost/thread/detail/thread_heap_alloc.hpp:17:0, 
//    from /usr/include/boost/thread/detail/thread.hpp:13, 
//    from /usr/include/boost/thread/thread.hpp:22, 
//    from /usr/include/boost/thread.hpp:13, 
//    from /home/son/dev/logistics/src/frameworks/networkService/NetworkConnection.cpp:13: 
///usr/include/boost/thread/pthread/thread_heap_alloc.hpp: In function ‘T* boost::detail::heap_new(A1&&) [with T = boost::detail::thread_data<void (*)()>, A1 = void (*&)()]’: 
///usr/include/boost/thread/detail/thread.hpp:130:95: instantiated from here 
///usr/include/boost/thread/pthread/thread_heap_alloc.hpp:24:47: error: cannot bind ‘void (*)()’ lvalue to ‘void (*&&)()’ 
///usr/include/boost/thread/detail/thread.hpp:43:13: error: initializing argument 1 of ‘boost::detail::thread_data<F>::thread_data(F&&) [with F = void (*)()]’ 

出于某种原因,我不能与呼叫升压启动一个新线程::线程t(升压::绑定(&提升: :asio :: io_service :: run,& io_service)); ,即使它可以工作,如果我通过简单的调用io_service.run()来替换它;

+0

为什么你想在handle_connect发送endpoint_iterator如果这个功能应该只得到ERROR_CODE? – ForEveR 2012-07-30 09:40:30

+0

你是指在最后一次电话中?对不起,这是我的错误复制和粘贴。你可以添加一个答案,以便我可以接受(编译和运行后)?谢谢。 – 2012-07-30 09:54:45

+0

所以,我给你答案,如果它不编译 - 给你的新代码。 – ForEveR 2012-07-30 10:34:51

回答

2

由于您的认证机构存在的签名

void AsioCommunicationService::handle_connect(const boost::system::error_code& error) 

此调用不正确。

tcp::endpoint endpoint = *endpoint_iterator; 
socket_.async_connect(endpoint, 
    boost::bind(&AsioCommunicationService::handle_connect, this, 
    boost::asio::placeholders::error, ++endpoint_iterator)); 

你最后相提并论是错误的,所以,正确的绑定是

boost::bind(&AsioCommunicationService::handle_connect, this, 
     boost::asio::placeholders::error)); 
相关问题