我試圖編寫一些代碼,可以在單獨的線程中執行類成員函數,但添加了一些用於檢查線程執行前後的賠率和結束的代碼。模板化的參數導致無法「查找函數」
爲此,我在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個參數
提前感謝!
/亨利克
好的叫!這隻能部分解決我的問題。現在用浮點數編譯它,但指針部分仍然給我同樣的錯誤。即使我在H構造函數的第一個和最後一個參數中加'*'。 – Henrik
啊,我不得不明確地做出void *轉換或將類函數改爲「int *」。謝謝! – Henrik