2013-05-10 35 views
0

在下面的代碼中,在thread t(&Fred::hello)我得到一個錯誤,該術語不計算爲帶有0個參數的函數。什麼是問題?創建具有類函數的線程時出錯

#include <iostream> 
#include <thread> 

using namespace std; 

class Fred 
{ 
public: 

virtual void hello(); 

}; 

void Fred::hello() 
{ 
cout << "hello" << endl; 
} 

int main() 
{ 
thread t (&Fred::hello); 
t.join(); 

return 0; 
} 

回答

4

T類的非靜態成員函數需要對T一個實例被調用,並採取T*類型的隱式第一參數(或const,和/或易失性T *)。當你傳遞一個非靜態成員函數的線程構造

所以

Fred f; 
f.hello() 

相當於

Fred f; 
Fred::hello(&f); 

所以,你必須通過隱含的第一個參數也:

Fred f; 
std::thread t(&Fred::hello, &f); 
+0

這是很好的解釋。但是有沒有可以使用emplace語義的線程構造函數的一個版本?這似乎是一個浪費,我必須通過'&f',只爲線程構造函數再次複製它? – Jimm 2013-05-10 15:43:23

+0

@Jimm線程構造函數將只複製*指針*,而不是'Fred'對象。 – juanchopanza 2013-05-10 15:45:30

+0

我只是嘗試傳遞'f'而不是'&f',比如'std :: thread t(&Fred:hello,f)',它似乎正在工作。 Plus構造函數只被調用一次。在這種情況下,線程構造函數似乎在避免f的複製。 – Jimm 2013-05-10 15:54:55