朋友寫了一個關於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