2012-11-19 148 views
2

我想使用boost :: bind和boost :: function,但出现编译错误。 为什么不能将占位符绑定到函数对象?为什么不这个“boost :: bind”编译?

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; 
} 
+0

什么是错误?你是否包含相关的asio头文件?如果使用_1代替asio占位符,它会编译吗? –

+0

有一个关于模板实例化的很长的错误信息,我想我已经包含了所有必要的头文件 – user1834749

回答

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

以供将来参考,它有助于增加

  • 完全编译例子
  • 完整的编译器/连接器的错误信息

当发布片段如t他在上面保存那些想要帮助你的人。

+0

谢谢你的回答,在我问这个问题之前我已经试过这种方式,但是我不想改变“ fobj“,这正是我想验证的。”boost :: bind(&fun_2,5)“可以编译,”boost :: bind(&fun_1,boost :: asio :: placeholders :: error)“can not.what这两个函数之间的区别,他们有相同数量的参数,只是不同的类型,是特殊对待的占位符? – user1834749

+2

@ user1834749不同之处在于'bind(&fun_2,5)'创建了一个不接受附加参数的“nullar”函数对象,而bind(&fun_1,praceholders :: error)或bind(&fun_1,_1) '用arity 1创建一个函数对象,即带有1个参数 - 应该由调用者提供:'fobj(someError)'。 –

2

如果你不能改变你需要传递价值,为error_code绑定,而不是一个占位符,以便它可以提供当函数被调用

签名即:

#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; 
} 
+0

aha,它的工作,谢谢。我想我需要访问更多的信息,当我们使用'async_read'或'async_write'和'bind'时,'placeholder :: error'如何转换为'system :: error_code&'。 – user1834749

+0

@ user1834749如果您对答案感到满意,您可以点击打勾接受它。 – mark