Multithreading 模板化参数导致无法;“查找函数”;

Multithreading 模板化参数导致无法;“查找函数”;,multithreading,class,templates,c++11,Multithreading,Class,Templates,C++11,我正在尝试编写一些代码,可以在单独的线程中执行类成员函数,但是添加了一些代码,用于在线程执行之前和之后检查零碎的东西 为此,我在VS2012中使用了c++11的std::bind和std::thread功能 如果我修正了类成员函数可能需要的参数,例如void*,所有这些都可以很好地工作,但是如果我尝试对其进行模板化,我会得到一个错误 代码概述 我有一个包含两个函数的简单类,它们将在一个线程中执行。他们的论点和名字不同 我正在创建的类有一个模板构造函数和一个函数,该函数执行前一个类的函数,但是如果

我正在尝试编写一些代码,可以在单独的线程中执行类成员函数,但是添加了一些代码,用于在线程执行之前和之后检查零碎的东西

为此,我在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;
    }