2010-02-20 117 views
67

以下代碼會導致cl.exe崩潰(MS VS2005)。
我想使用升壓綁定來創建一個函數來調用一個MyClass的的方法:如何在成員函數中使用boost綁定

#include "stdafx.h" 
#include <boost/function.hpp> 
#include <boost/bind.hpp> 
#include <functional> 

class myclass { 
public: 
    void fun1()  { printf("fun1()\n");  } 
    void fun2(int i) { printf("fun2(%d)\n", i); } 

    void testit() { 
     boost::function<void()> f1(boost::bind(&myclass::fun1, this)); 
     boost::function<void (int)> f2(boost::bind(&myclass::fun2, this)); //fails 

     f1(); 
     f2(111); 
    } 
}; 

int main(int argc, char* argv[]) { 
    myclass mc; 
    mc.testit(); 
    return 0; 
} 

我在做什麼錯?

回答

89

改用以下:

boost::function<void (int)> f2(boost::bind(&myclass::fun2, this, _1)); 

此轉發傳遞給函數的對象使用佔位函數的第一個參數 - 你要告訴Boost.Bind如何處理的參數。用你的表達式,它會試圖把它解釋爲不帶任何參數的成員函數。
參見例如herehere的常用使用模式。

注意VC8s CL.EXE定期Boost.Bind濫用崩潰 - 如果有疑問,使用測試用例用gcc,你可能會得到很好的提示,如模板參數綁定 -internals被實例化,如果您通讀輸出。

+0

任何機會,你可以幫助這個http://stackoverflow.com/questions/13074756/how-to-avoid-static-member-function-when-using-gsl-with-c?它是相似的,但'std :: function'給出了一個錯誤 – 2012-10-29 04:28:22

+0

謝謝,這有點令人困惑,但你的答案拯救了我的培根! – portforwardpodcast 2014-06-20 02:28:11

相關問題