Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/168.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::绑定成员函数(作为boost::asio异步写入处理程序)_C++_Boost_Asynchronous_Boost Asio_Boost Bind - Fatal编程技术网

C++ boost::绑定成员函数(作为boost::asio异步写入处理程序)

C++ boost::绑定成员函数(作为boost::asio异步写入处理程序),c++,boost,asynchronous,boost-asio,boost-bind,C++,Boost,Asynchronous,Boost Asio,Boost Bind,我使用boost::bind将处理函数传递给boost::asio::async\u write。当我使用自由函数时,它工作得很好,但是当我尝试在类中移动函数时,bind会产生我无法解释的错误 工作原理: 我用以下代码编写一些数据: boost::asio::async_write(*socket, boost::asio::buffer(data(), l

我使用boost::bind将处理函数传递给boost::asio::async\u write。当我使用自由函数时,它工作得很好,但是当我尝试在类中移动函数时,bind会产生我无法解释的错误

工作原理: 我用以下代码编写一些数据:

boost::asio::async_write(*socket,
                         boost::asio::buffer(data(),
                                             length()),
                         boost::bind(handlermessagewrite,
                                     boost::asio::placeholders::error,
                                     this,
                                     boost::asio::placeholders::bytes_transferred));
然后我用一个自由函数处理写操作,该函数的签名为:

void handlermessagewrite(const boost::system::error_code& errorcode,
                         iodata *msg,
                         size_t bytes_transferred);
这一切都按预期进行

我想做的是: 我正在类中移动处理程序
ioclient

class ioclient {
public:
  void handlermessagewrite(const boost::system::error_code& errorcode,
                           iodata *msg,
                           size_t bytes_transferred);
}

void ioclient::handlermessagewrite(const boost::system::error_code& errorcode,
                                   iodata *msg,
                                   size_t bytes_transferred);
并相应地调整boost::bind代码,如官方asio教程所示:

-boost::bind(handlermessagewrite,

+boost::bind(&ioclient::handlermessagewrite,

但是,这会产生一些非常不透明的编译错误,而在我的IDE(code::blocks)中,其中一行似乎最终被截断,这一事实无助于此:

\boost\bind\bind_template.hpp | 102 |是boost:| bi::bind|t::result|u type boost:| bi::bind|t::operator()(常数A1&,常数A2&)[带A1=boost::system::error\u code;A2=unsigned int;R=void;F=boost:(u mfi::mf2;L=boost:| bi::list3(*),boost:| bi::value,boost::arg(*>;boost:| bi::bind::result=void'| \boost\asio\impl\write.hpp | 261 |来自'void boost::asio::detail::write_op::operator()(const boost::system::error_code&,std::size_t,int)[with AsyncWriteStream=boost::asio::basic_stream|socket;CompletionCondition=boost::asio::detail::transfer\u all;WriteHandler=boost:_bi::bind\u t,boost::::_bi::list3(*),boost:(bust:)bi::va:)| \boost\asio\impl\write.hpp | 585 |来自'void boost::asio::async|u write(AsyncWriteStream&,const ConstBufferSequence&,WriteHandler&)[带AsyncWriteStream=boost::asio::basic_stream|socket;ConstBufferSequence=boost::asio::可变|buffers|1;WriteHandler=boost:| bi::bind|,boost:| bi::list3(*),boost:| bi::value,boost::arg(*)> >]'| \需要从这里输入iodata.cpp | 76 || \boost\bind\bind.hpp | 392 |错误:调用“(boost::mfi::mf2)(const boost::system::error|code&,iodata*&,const unsigned int&)不匹配| \boost\bind\mem_fn_template.hpp | 253 |注:候选人包括:| \boost\bind\mem_fn_template.hpp | 278 |注:R boost:_mfi::mf2::operator()(T*,A1,A2)const[with R=void;T=ioclient;A1=const boost::system::error_code&;A2=iodata*]| \boost\bind\mem_fn_template.hpp | 278 |注意:参数1从'const boost::system::error_code'到'ioclient*'的转换未知| \boost\bind\mem_fn_template.hpp | 283 |注:模板R boost:_mfi::mf2::operator()(U&,A1,A2)const[带U=U;R=void;T=ioclient;A1=const boost::system::error_code&;A2=iodata*]| \boost\bind\mem_fn_template.hpp | 283 |注意:模板参数推导/替换失败:| \boost\bind\bind.hpp((键入“iodata*”)以键入“const boost::system:”| \boost\bind\mem_fn_template.hpp | 291 |注:模板R boost:_mfi::mf2::operator()(常数U&,A1,A2)const[带U=U;R=void;T=ioclient;A1=const boost::system::error_code&;A2=iodata*]| \boost\bind\mem_fn_template.hpp | 291 |注意:模板参数推导/替换失败:| \boost\bind\bind.hpp((键入“iodata*”)以键入“const boost::system:”| \boost\bind\mem_fn_template.hpp | 299 |注:R boost:_mfi::mf2::operator()(T&,A1,A2)const[with R=void;T=ioclient;A1=const boost::system::error_code&;A2=iodata*]| \boost\bind\mem_fn_template.hpp | 299 |注意:参数1没有从'const boost::system::error_code'到'ioclient&'的已知转换|


我确信bind有问题,但我不知道这可能是什么。有什么想法吗?

使用实例方法时,必须将
指针作为bind()的第二个参数传递

编辑:

我已经完成了您尝试使用boost::asio所做的工作。以下是我的实现中的一个片段:

        boost::asio::async_write(
            m_Socket,
            boost::asio::buffer((const unsigned char *)(rMsg.c_str()), rMsg.length()),
            boost::bind(&ServerToClientConnT::HandleAsioWrite,
                        this,
                        boost::asio::placeholders::error,
                        boost::asio::placeholders::bytes_transferred));
其中HandleAsioWrite方法声明如下:

void HandleAsioWrite(const boost::system::error_code& rErrorCode,
                     std::size_t nBytesTransferred);

初始示例失败,因为将调用成员函数的对象实例未传递到
bind
。这在编译器错误中指出,其中指出没有从
const boost::system::error_code
ioclient*
的已知转换

当与成员指针一起使用时,有文档记录

boost::bind(&X::f,args)
相当于
boost::bind(boost::mem\u fn(&X::f,args)

此外,委员会的文件规定:

它[
boost::mem_fn
]支持具有多个参数的成员函数指针,并且返回的函数对象可以将指向对象实例的指针、引用或智能指针作为其第一个参数

因此,如果
boost::bind
的第一个参数是成员指针,那么:

  • bind调用中的第二个参数必须是对象实例的句柄,因为它将是传递给从
    boost::mem\u fn
    返回的函数对象的第一个参数
  • boost::bind
    返回的函数对象必须在与
    \u 1
    占位符匹配的参数位置传递对象实例句柄
例如,给定

struct Foo
{
  void do_something(int x) {}
};
do\u something
成员函数可以是
Foo f;
boost::bind(&Foo::do_something, &f, _1)(42);     // handle is second argument.
boost::bind(&Foo::do_something, _1, _2)(&f, 42); // handle matches _1 position.
boost::bind(&Foo::do_something, _2, _1)(42, &f); // handle matches _1 position.
ioclient client;
iodata data;

boost::asio::async_write(
  socket,
  boost::asio::null_buffers(),
  boost::bind(&ioclient::handlermessagewrite,
              &client,
              boost::asio::placeholders::error,
              &data,
              boost::asio::placeholders::bytes_transferred));