首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost元组导致boost绑定/ boost函数出现问题?

boost元组导致boost绑定/ boost函数出现问题?
EN

Stack Overflow用户
提问于 2012-01-21 10:16:00
回答 1查看 411关注 0票数 1

我认为我的问题在这里是很常见的,但我就是看不出我在这里做错了什么。

我正在做一些boost::asio的工作,并试图编写一个模板化的异步读取函数。

下面是一个函数。

代码语言:javascript
复制
template <typename Handler>
void AsyncRead(std::vector<boost::uint8_t>& _inMsg, Handler _handler)
{
    #if debug
      std::cout<< "IConnection::AsyncRead" << std::endl;
    #endif
    using namespace protocols;

    typedef boost::tuple<Handler> tHandler;
    typedef boost::function< void(const boost::system::error_code &, std::vector<boost::uint8_t> &, tHandler ) > HeaderReaderFunc;

    //void (AConnection::*f)(const boost::system::error_code&, std::vector<boost::uint8_t>&, boost::tuple<Handler>) = &AConnection::HandleReadHeader<Handler>;


    tHandler t(boost::make_tuple(_handler));
    HeaderReaderFunc x(boost::bind(&AConnection::HandleReadHeader<Handler>, this, boost::asio::placeholders::error, boost::ref(_inMsg), t));
    inboundHeader.resize(sizeof(SocketIO::MsgData));
    boost::asio::async_read(socket, boost::asio::buffer(inboundHeader), x);

}

在这个函数的最后一条语句中,事情开始变得糟糕。

代码语言:javascript
复制
boost::asio::async_read(socket, boost::asio::buffer(inboundHeader), x);

当我试图将变量'x‘作为参数传递给async_read函数时。

这些错误在长度和缺乏可理解的含义方面都是传奇。

这只是一个错误输出的小示例:

代码语言:javascript
复制
boost_1_38_0/boost/asio/detail/bind_handler.hpp: In member function ‘void boost::asio::detail::binder2<Handler, Arg1, Arg2>::operator()() [with Handler =  boost::function<void ()(const boost::system::error_code&, std::vector<unsigned char, std::allocator<unsigned char> >&, boost::tuples::tuple<boost::function<void ()(const boost::system::error_code&)>, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type, boost::tuples::null_type>)>, Arg1 = boost::system::error_code, Arg2 = unsigned int]’:

如果我在这里不使用boost函数,而是使用注释掉的行,这是对成员函数的引用,事情似乎可以工作,但我不知道为什么会这样。

AConnection::HandleReadHeader函数模板的函数签名为:

代码语言:javascript
复制
template <typename Handler>
void HandleReadHeader(const boost::system::error_code& _e,
                    std::vector<boost::uint8_t> & _inMsg, 
                    boost::tuple<Handler> _handler)

处理程序的类型为:

代码语言:javascript
复制
    boost::function<void (const boost::system::error_code & ) >

函数AsyncRead和HandleReadHeader是我自己的类AConnection的成员(可能并不重要)。

关于创建boost::function对象的签名包含boost::tuple的语法,我可能遗漏了什么,或者boost::asio::async_read函数的第三个参数类型与我的变量'x‘不匹配。

任何帮助都将不胜感激。谢谢。

编辑:

下面是可以工作的代码,但使用了成员函数引用而不是boost::functon。

代码语言:javascript
复制
template <typename Handler>
void AsyncRead(std::vector<boost::uint8_t>& _inMsg, Handler _handler)
{
 #if debug
   std::cout<< "Connection::AsyncRead" << std::endl;
 #endif
 using namespace protocols;
 // Issue a read operation to read exactly the number of bytes in a header.
 void (Connection::*f)(
     const boost::system::error_code&,
     std::vector<boost::uint8_t>&, boost::tuple<Handler>)
   = &Connection::HandleReadHeader<Handler>;

 inboundHeader.resize(sizeof(simple::message_header));
 boost::asio::async_read(socket, boost::asio::buffer(inboundHeader),
     boost::bind(f,
     this, boost::asio::placeholders::error, boost::ref(_inMsg),
     boost::make_tuple(_handler)));
}
EN

回答 1

Stack Overflow用户

发布于 2012-01-21 12:53:25

您的变量x具有以下类型:

代码语言:javascript
复制
boost::function< void(const boost::system::error_code &,
    std::vector<boost::uint8_t> &, boost::tuple<Handler>) >

它类似于这个签名:

代码语言:javascript
复制
void handler(const boost::system::error_code &,
    std::vector<boost::uint8_t> &, boost::tuple<Handler>)

然而,Boost Asio文档说处理程序签名应该是这样的:

代码语言:javascript
复制
void handler(const boost::system::error_code&,
    std::size_t bytes_transferred)

所以,你的签名不匹配--甚至不是很接近。要么你使用了一些我在Boost文档中找不到的重载,要么你需要更改HeaderReaderFunc类型以匹配async_read期望的类型。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8950127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档