2017-04-09 67 views
0

這個問題類似:Start thread with member function這一個:std::thread calling method of class與派生類的成員函數啓動線程

不過,我有以下幾點:

#include <thread> 
#include <iostream> 
class myAbstractClass { 
public: 
    virtual void myFunction() = 0;//abstract class 
} 

class myFirstClass : public myAbstractClass { 
public: 
    void myFunction() { std::cout << "First class here";} 
} 

class mySecondClass : public myAbstractClass { 
public: 
    void myFunction() { std::cout << "Second class here";} 
} 

然後,我要叫myFunction()從一個不同的地方新線程,但以下不編譯(我想不出其他任何東西嘗試):

public void callMemberFunctionInThread(myAbstractClass& myInstance) { 
    std::thread myThread (&myAbstractClass::myFunction, myInstance); 
    //supposed to call myInstance.myFunction() on myThread 
} 
+1

「不編譯」不是很具體。你收到什麼錯誤信息? –

+0

Intellisense不抱怨,編譯開始,然後它給'C2259'myAbstractClass':不能實例化位於C:\ Program Files文件(x86)\ Microsoft Visual Studio \ 2017 \ Community \ VC中的文件'tuple'中的抽象類\ Tools \ MSVC \ 14.10.25017 \ include'(line 199) – ProgrammingMachine5000

+1

'std :: ref(myInstance)'? – peppe

回答

1

通過std::ref(myInstance)。請注意0​​構造函數將傳遞給它的參數的副本(請參閱here),並且不能複製myAbstractClass

(然後,所有的這仍會因爲std::thread功能在的std::invoke,其解開由std::ref獲得的std::reference_wrapper並調用成員函數指針到它的術語描述工作。參見here)。