朋友写了一个关于boost::function和boost::bind的代码,却老是编译错误,在网上查了不少资料,不是很明白,遂下决心仔细研究下boost::bind的代码,毕竟也就10几个文件嘛。 .net
在研究的过程当中参考了:http://blog.csdn.net/hengyunabc/article/details/7773250的讲解,给了我很大的帮助,很是感谢!但网上的大多数讲解粘贴的模版代码太多,给想了解boost::bind真相的人带来了没必要要的阻碍,因此我决定只给你们重点介绍boost::bind中实现的重点,只要明白了这个,实际生产过程当中的使用就不会有疑惑了。虽然是简化版本可是仍是不少的,因此关于boost::bind的详细解析请参考个人另外一篇博文: code
首先粘贴朋友的错误代码: blog
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; }咱们能够先把与boost::function相关的放一边,其实咱们能够发现:
boost::bind(&fun_2,_1)();//compile failed
编译报错和上面的状况大同小异,其实问题主要是与boot::bind的占位符的用法有关,因此下面我就用这个例子来分析,最后再回到朋友的问题。 get
相信到了这里,一切问题都了然了,list0中不存在operator[](boost::argv<1>()重载,固然报错了。 源码
咱们回到上面的问题,由于没有查看boost::function源码,可是能够确定的是boost::function<void ()>中的void()声明的做用确定会生成一个list0,因此致使了这个错误。 io