ASIO处理程序参数和boost :: bind,编译时错误

NRA

我正在努力解决编译时错误,请尝试尝试,但我看不出我是怎么做的错误或与文档/示例中列出的处理程序函数签名不同。(我在Linux上使用Boost 1.41)

请帮助我理解错误!(包括在下面的摘录中)

我的应用程序有一些对象,这些对象的方法是async_ *函数的处理程序。下面是代码片段。在标记为“第58行”的行中报告了错误,我在其中使用了boost :: bind

class RPC {

public:
    char recv_buffer[56];

    void data_recv (void) {
        socket.async_read_some (
                boost::asio::buffer(recv_buffer),
                boost::bind ( &RPC::on_data_recv, this, _1, _2 )
        );   // **<<==== this is line 58, that shows up in error listing**

        global_stream_lock.lock();
        std::cout << "[" << boost::this_thread::get_id()
            << "] data recvd" << std::endl;
        global_stream_lock.unlock();

    } // RPC::data_recv

    void on_data_recv (boost::system::error_code& ec, std::size_t bytesRx) {
        global_stream_lock.lock();
        std::cout << "[" << boost::this_thread::get_id()
            << "] bytes rcvd: " << std::endl;
        global_stream_lock.unlock();

        data_recv();  // call function that waits for more data

    } // RPC::on_data_recv

};  // RPC class def

有巨大的错误输出,但相关的行似乎是:

../src/besw.cpp:58:   instantiated from here
/usr/include/boost/bind/bind.hpp:385: error: no match for call to ‘(boost::_m    fi::mf2<void, RPC, boost::system::error_code&, long unsigned int>) (RPC*&, boost::asio::error::basic_errors&, int&)’
/usr/include/boost/bind/mem_fn_template.hpp:272: note: candidates are: R boost::_mfi::mf2<R, T, A1, A2>::operator()(T*, A1, A2) const [with R = void, T = RPC, A1 = boost::system::error_code&, A2 = long unsigned int]
/usr/include/boost/bind/mem_fn_template.hpp:291: note:                R boost::_mfi::mf2<R, T, A1, A2>::operator()(T&, A1, A2) const [with R = void, T = RPC, A1 = boost::system::error_code&, A2 = long unsigned int]
make: *** [src/besw.o] Error 1

当我删除占位符(_1和_2)并使用没有参数的处理程序时,它将编译并执行而没有错误。这是修改后的代码段。

    void data_recv (void) {
    socket.async_read_some (
            boost::asio::buffer(recv_buffer),
            boost::bind ( &RPC::on_data_recv, this )
    );

    global_stream_lock.lock();
    std::cout << "[" << boost::this_thread::get_id()
        << "] data recvd" << std::endl;
    global_stream_lock.unlock();

} // RPC::data_recv

void on_data_recv (void) {
...
}

错误代码不能作为参考。按值或const&使其:

void on_data_recv(boost::system::error_code/* ec */, size_t /*bytes_transferred*/) {

另外,请考虑使用Asio专用占位符:

    socket.async_read_some(boost::asio::buffer(recv_buffer),
                           boost::bind(&RPC::on_data_recv, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

也要使用适当的锁止装置。我们在C ++中!使事情变得异常安全很容易,为什么不呢?

Live On Coliru

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <iostream>

#include <boost/thread.hpp>

static boost::mutex global_stream_lock;

class RPC {
    char recv_buffer[56];
  public:

    void data_recv() {
        socket.async_read_some(boost::asio::buffer(recv_buffer),
                               boost::bind(&RPC::on_data_recv, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

        boost::lock_guard<boost::mutex> lk(global_stream_lock);
        std::cout << "[" << boost::this_thread::get_id() << "] data recvd" << std::endl;
        global_stream_lock.unlock();
    }

    void on_data_recv(boost::system::error_code/* ec */, size_t /*bytes_transferred*/) {
        {
            boost::lock_guard<boost::mutex> lk(global_stream_lock);
            std::cout << "[" << boost::this_thread::get_id() << "] bytes rcvd: " << std::endl;
        }

        data_recv(); // call function that waits for more data
    }

    boost::asio::io_service service;
    boost::asio::ip::tcp::socket socket{service};
}; // RPC class def

int main() {}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

编译Boost.Bind时出错

来自分类Dev

编译Boost.Bind时出错

来自分类Dev

Boost Asio - boost::bind 导致程序崩溃

来自分类Dev

Boost Spirit队长-编译时错误

来自分类Dev

Boost Spirit队长-编译时错误

来自分类Dev

使用CodeDom编译时处理错误

来自分类Dev

编译时参数的处理

来自分类Dev

程序抛出编译时错误oracle

来自分类Dev

生成类型提供程序的编译时错误

来自分类Dev

如何检测和处理NSIS编译时错误?

来自分类Dev

编译时错误和构造函数“ Super”

来自分类Dev

编译时错误和构造函数“超级”

来自分类Dev

编译时出现Cmake和Qt错误

来自分类Dev

进行取消时,boost :: asio :: yield_context可以用作Duration_timer处理程序吗?

来自分类Dev

尝试解析Boost Spirit语法时的编译时错误

来自分类Dev

代码中的参数正确,编译时参数错误

来自分类Dev

使用Boost编译mexfunction时出现链接器错误

来自分类Dev

当lexer令牌> 10时boost :: spirit编译错误

来自分类Dev

尝试编译时出现Boost C2064错误

来自分类Dev

Boost Spirit Qi:轻微更改规则时编译错误

来自分类Dev

Boost状态图-使用状态图作为模板参数时出现编译错误

来自分类Dev

根据参数值产生编译时错误的构造方法

来自分类Dev

使用模板参数列表时的编译错误

来自分类Dev

使用变量参数时,GCC会编译错误

来自分类Dev

构造函数中的默认参数会导致编译时错误

来自分类Dev

编译Java程序“找不到符号”时发生错误

来自分类Dev

std :: remove_if和std :: isspace-编译时错误

来自分类Dev

观看时使用Grunt和Uglify- 多次编译(错误?)

来自分类Dev

使用Streams和Maven时出现编译错误