2

我正在尝试将 boost::bind 与 boost::function 一起使用,但出现了编译错误。为什么不能将占位符绑定到函数对象?

void fun_1(const boost::system::error_code& error)
{
    std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
    std::cout<<"tset_2------------"<<std::endl;
}
int main(void)
{
    boost::function0<void> fobj;
    //fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed
    fobj = boost::bind(&fun_2,5);//syntax is ok
    return 0;
}
4

3 回答 3

2

您的签名不匹配。试试这个:

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

void fun_1(const boost::system::error_code& error)
{
    std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
    std::cout<<"tset_2------------"<<std::endl;
}

int main(void)
{
    boost::function<void (const boost::system::error_code&)> fobj;
    fobj = boost::bind(&fun_1,boost::asio::placeholders::error);
    return 0;
}

编译在 gcc 下测试g++ main.cpp -lboost_system -lpthread

为了将来参考,它有助于添加

  • 完全可编译的例子
  • 完整的编译/链接器错误消息

在发布上述片段以节省想要帮助您时间的人时。

于 2012-11-19T08:35:13.087 回答
2

如果您无法更改签名,则需要传递error_code要绑定的值而不是占位符,以便在调用函数时提供它

IE:

#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/asio.hpp>
#include <boost/system/error_code.hpp>

void fun_1(const boost::system::error_code& error)
{
    std::cout<<"test_1------------"<<std::endl;
}
void fun_2(int i)
{
    std::cout<<"tset_2------------"<<std::endl;
}

int main()
{
    boost::function0<void> fobj;
    //fobj = boost::bind(&fun_1,boost::asio::placeholders::error);//compile failed

    fobj = boost::bind( &fun_1,
            boost::system::errc::make_error_code( boost::system::errc::success ) );//compiles ok

    // fobj = boost::bind(&fun_2,5);//syntax is ok
    return 0;
}
于 2012-11-19T10:07:44.360 回答
0

注: 通过查看http://my.oschina.net/yellia/blog/90678,作者清晰简洁地解释了boost::bind的实现。希望对你有帮助。哈哈

于 2012-11-21T05:01:15.690 回答