2014-01-13 69 views
0

我試圖編寫一些代碼,可以在單獨的線程中執行類成員函數,但添加了一些用於檢查線程執行前後的賠率和結束的代碼。模板化的參數導致無法「查找函數」

爲此,我在VS2012中使用了C++ 11的std :: bind和std :: thread功能。

所有這一切都很好,如果我修正了類成員函數可能需要的參數void *,但如果我嘗試模板,我得到一個錯誤。

代碼

概述我有一個包含兩個功能,這將在一個線程中執行的簡單類。他們在論點和名稱上有所不同。

我正在創建的類有一個模板化的構造函數和一個函數,它執行前一個類的函數,但是如果線程執行/未完成,就可以執行自己的檢查/通知。

最後主要功能就是測試代碼。

守則

包括部分:要執行

#include <iostream> 
    #include <memory> 
    #include <thread> 
    #include <functional> 

    using namespace std; 

類:

class k1 
    { 
    public: 
     k1(int nVal = 0) : _val(nVal){}; 
     ~k1(){}; 

     void doFunc(void * pParam){ 
      cout << "Val in class = " << _val << ", param = " << pParam << "\n"; 
     } 

     void doFunc2(float pParam){ 
      cout << "Val in class = " << _val << ", param = " << pParam << "\n"; 
     } 

     int _val; 
    }; 
    typedef shared_ptr<k1> PK; 

線程處理類

class H 
    { 
    public: 
     void controlFunction(std::function<void(void)> callRef){ 
      cout << "Before calling\n"; 
      callRef(); 
      cout << "After calling\n"; 
     } 

     template<class T, typename ParamType> // Constructor for any type of class function - void * parameter as only input 
     H(void(T::* pFunction)(ParamType *), T * pClass, ParamType pParam){ 
      std::function<void(void)> _call = std::bind(pFunction, pClass, pParam); 
      _thread = shared_ptr<std::thread>(new thread(&H::controlFunction, this, _call)); 
     } 


     ~H(void){ 
      _thread->join(); 
     } 

     shared_ptr<thread> _thread; 
    }; 
    typedef shared_ptr<H> PH; 

主要功能:

int main(int argc, char* argv[]) 
    { 
     PK k = make_shared<k1>(12); 

     int i1 = 2; 
     float f1 = 1.0f; 

     PH p = PH(new H(&k1::doFunc, k.get(), &i1)); 
     PH p2 = PH(new H(&k1::doFunc2, k.get(), f1)); 

     return 0; 
    } 

說出來是錯誤:

錯誤C2660:1 H :: H':函數不接受3個參數

提前感謝!

/亨利克

回答

0

猜測在那裏你創建一個H對象以k1::doFunc2的說法,你在第二行的錯誤。錯誤的可能原因是因爲k1::doFunc2不帶參數指針,而構造函數H中的成員函數指針參數期望它。

當您聲明p變量時,第一行也有一些問題。這是因爲ParamType模板類型可以推導爲或者intint*。原因是因爲成員函數指針有ParamType *,而構造函數的第三個參數使用非指針ParamType,但是您在此傳遞一個指針(&i1)。

+0

好的叫!這隻能部分解決我的問題。現在用浮點數編譯它,但指針部分仍然給我同樣的錯誤。即使我在H構造函數的第一個和最後一個參數中加'*'。 – Henrik

+0

啊,我不得不明確地做出void *轉換或將類函數改爲「int *」。謝謝! – Henrik

相關問題