2009-02-13 135 views
2

我想使用boost ::線程在我的計劃,但得到以下編譯器錯誤(Visual Studio 2005中):升壓:螺紋 - 編譯器錯誤

Error 1 **error C2064**: term does not evaluate to a function taking 0 
arguments d:\...\boost_1_37_0\boost\thread\detail\thread.hpp 56 

所以我試圖重新創建一個小問題程序並修改了從this site開始工作的Hello World示例。

我的測試代碼現在看起來像這樣。爲什麼不是一類?:

#include <boost/thread.hpp> 
#include <iostream> 


class HelloWorld 
{ 
public: 
    void hello(); 
    void entry(); 
}; 

void HelloWorld::entry() 
{ 
    boost::thread thrd(&HelloWorld::hello); 
    thrd.join(); 
} 

void HelloWorld::hello() 
{ 
    std::cout << "Hello world, I'm a thread!" << std::endl; 
} 

int main(int argc, char* argv[]) 
{ 
    HelloWorld *bla = new HelloWorld; 
    bla->entry(); 
    return 0; 
} 

回答

7

嘗試像這樣 - boost :: thread構造函數期待boost :: function0(函數指針是,但是由於這個指針而不是成員函數指針)。

void HelloWorld::entry() 
{ 
    boost::thread thrd(boost::bind(&HelloWorld::hello,this)); 
    thrd.join(); 
} 
+0

非常感謝你!它現在適用於您的解決方案。 /mspoerr – mspoerr 2009-02-13 15:48:01

0

內部工作你傳遞一個成員函數的線程對象的功能,當線程啓動時調用。由於線程本身沒有對象,因此無法調用成員函數。你可以使hello函數爲靜態,或者查看boost :: bind庫來發送對象。

4

成員函數具有指針作爲第一個參數。由於有一個boost :: thread構造函數接受函數參數,所以不需要使用boost :: bind。這也將工作:

void HelloWorld::entry() 
{ 
    boost::thread thrd(&HelloWorld::hello,this); 
    thrd.join(); 
} 

如果你的函數需要的參數,你可以把他們的指針參數後。