2013-03-06 43 views
2

從我似乎可以這樣傳遞參數給線程函數的boost ::線程文件:傳遞參數,以提高::線程沒有重載函數需要兩個參數

boost::thread* myThread = new boost::thread(callbackFunc, param); 

然而,當我做該編譯器抱怨

沒有重載函數需要兩個參數

我的代碼:

#include <boost/thread/thread.hpp> 
void Game::playSound(sf::Sound* s) { 
    boost::thread soundThread(playSoundTask, s); 
    soundThread.join(); 
} 

void Game::playSoundTask(sf::Sound* s) { 
    // do things 
} 

我正在使用Ogre3d附帶的提升副本,我猜可能會很老。有趣的是,我看了一下thread.hpp,它有2個或多個參數的構造函數的模板。

+1

你的第一個問題是試圖初始化'thread'對象與'螺紋*',但你的錯誤是不相關的 - 這聽起來像你要麼缺少'#include '或者使用**真的**舊版本的Boost ... – ildjarn 2013-03-06 22:53:53

+0

你能發佈一個[sscce](http:// sscce。組織/)? – juanchopanza 2013-03-06 22:56:30

+0

@ildjarn啊,我傻了。我在描述我的代碼時犯了一個錯字。我會用我的實際代碼和更多信息更新這個問題 – 2013-03-06 23:03:04

回答

6

問題是成員函數採用隱含的第一個參數Type*,其中Type是類的類型。這是成員函數在類型實例上調用的機制,並且意味着您必須將一個額外參數傳遞給boost::thread構造函數。您還必須將成員函數的地址作爲&ClassName::functionName傳遞。

我做了一個小的編譯和運行的例子,我希望說明了如何使用:

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

struct Foo 
{ 
    void foo(int i) 
    { 
    std::cout << "foo(" << i << ")\n"; 
    } 
    void bar() 
    { 
    int i = 42; 
    boost::thread t(&Foo::foo, this, i); 
    t.join(); 
    } 
}; 

int main() 
{ 
    Foo f; 
    f.bar(); 
} 
+0

好啊!它現在建立,謝謝! – 2013-03-06 23:27:54

+0

這將如何工作的免費功能? – 2015-06-11 11:41:03

+0

@VisionIncision'boost :: thread(the_function,arg0,arg1,arg2,....)'。網上有很多關於此的帖子。 – juanchopanza 2015-06-11 11:45:45