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