Multithreading 模板化参数导致无法;“查找函数”;
我正在尝试编写一些代码,可以在单独的线程中执行类成员函数,但是添加了一些代码,用于在线程执行之前和之后检查零碎的东西 为此,我在VS2012中使用了c++11的std::bind和std::thread功能 如果我修正了类成员函数可能需要的参数,例如void*,所有这些都可以很好地工作,但是如果我尝试对其进行模板化,我会得到一个错误 代码概述 我有一个包含两个函数的简单类,它们将在一个线程中执行。他们的论点和名字不同 我正在创建的类有一个模板构造函数和一个函数,该函数执行前一个类的函数,但是如果线程没有/没有完成,它可以执行自己的检查/通知 最后,主要功能只是测试代码 代码 包括部分:Multithreading 模板化参数导致无法;“查找函数”;,multithreading,class,templates,c++11,Multithreading,Class,Templates,C++11,我正在尝试编写一些代码,可以在单独的线程中执行类成员函数,但是添加了一些代码,用于在线程执行之前和之后检查零碎的东西 为此,我在VS2012中使用了c++11的std::bind和std::thread功能 如果我修正了类成员函数可能需要的参数,例如void*,所有这些都可以很好地工作,但是如果我尝试对其进行模板化,我会得到一个错误 代码概述 我有一个包含两个函数的简单类,它们将在一个线程中执行。他们的论点和名字不同 我正在创建的类有一个模板构造函数和一个函数,该函数执行前一个类的函数,但是如果
#include <iostream>
#include <memory>
#include <thread>
#include <functional>
using namespace std;
#包括
#包括
#包括
#包括
使用名称空间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;
k1类
{
公众:
k1(int-nVal=0):(u-val(nVal){};
~k1(){};
void doFunc(void*pParam){
cout我猜您在第二行得到了错误,在那里您创建了一个H
对象,并将k1::doFunc2
作为参数。错误的可能原因是k1::doFunc2
没有将指针作为参数,而H
构造函数中的成员函数指针参数期望它这样做
当您声明p
变量时,第一行也存在一些问题。这是因为ParamType
模板类型可以推断为int
或int*
。原因是成员函数指针具有ParamType*
,而构造函数使用非指针ParamType
,但在此处传递指针(&i1
).很好!这只部分解决了我的问题。带浮点数的部分现在可以正常编译,但指针部分仍然会给我相同的错误。即使我在H构造函数的第一个和最后一个参数中添加了“*”。啊,我必须显式地进行void*转换或将类函数更改为“int*”。谢谢!
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;
}