2014-02-14 248 views
4

創建的shared_ptr 的一個實例,考慮下面的代碼: 與make_shared <std::thread>

class A 
{ 
    .... 
    shared_ptr<std::thread> mThread; 
    void Step(); 
    void LaunchTrhead(); 
} 

void A::LaunchThread() 
{ 
    ... 
    mThread=make_shared<std::thread>(Step); // This line gives an error 
    ... 
} 

void A::Step() 
{ 
    ... 
} 

我試圖初始化共享指針mThread,使其調用該函數步驟。然而,編譯器給我的錯誤「無效的類型的引用的類型的初始化......」類型'未解析的重載函數類型'「的表達式。很顯然,我正在做一些愚蠢的事情,但我不能把它放在手指上。任何人都可以幫忙嗎?提前致謝!

回答

5

Step()是一個非靜態成員函數,因此它有一個隱含的A*類型的第一個參數。調用它時,您需要綁定A的當前實例。

mThread = std::make_shared<std::thread>(std::bind(&A::Step, this)); 

您還可以使用lambda代替bind

mThread = std::make_shared<std::thread>([this]{ Step(); }); 

由於@Casey在評論中指出,std::thread's constructor具有指針成員函數特殊處理,並將承擔第一下列說法是一個指向或調用成員函數的實例的引用。這意味着您可以避開bind並直接通過this作爲第二個參數。

mThread = std::make_shared<std::thread>(&A::Step, this); 
+0

當場!編譯器告訴我(「未解決的功能」),但我只是看不到它,我完全失明(我應該回家......)。另外,根據你所指出的,我可以聲明* Test * static。但是你的解決方案對我而言更實用,因爲它避免了必須將指針傳遞給所有者對象。謝謝! – DrD

+1

您可以直接將指向成員和指向對象的指針傳遞給std :: thread構造函數(以及std :: bind和std :: async):mThread = std :: make_shared (&A :: Step,this);' – Casey

+0

@Casey不知道,謝謝! – Praetorian

1

嘗試(使用labda代替遊離功能):

mThread=make_shared<std::thread>([this](){ Step(); }); 

事情是這樣的,你不及格的引用,這它是一個成員函數的構造inspite。

該解決方案使用lambda創建一個函數對象,該函數不帶任何參數但引用了此參數。

如果你想使用全局函數做到這一點,而不是和移動void Step()到它的使用前:

mThread=make_shared<std::thread>(::Step()); 

::刪除在功能範圍的模糊性。

+0

::步()沒有按;噸的工作,對不起。 lambda解決方案。謝謝! – DrD

+0

您是否將'Step()'的定義移動到'LaunchThread'之前 – nishantjr

+0

Step()是一個成員函數,只是我忘記在其聲明中包含A ::。現在它被編輯了。我很抱歉。 – DrD

0

你應該使用shared_from_this()替換這個

+0

您能否提供一個更完整的建議示例? – rsilva4

相關問題