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

时间:2014-01-13 09:44:15

标签: multithreading class templates c++11

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

为此,我在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:'H :: H':函数不带3个参数

提前致谢!

/亨里克

1 个答案:

答案 0 :(得分:0)

猜测您在创建H对象并以k1::doFunc2为参数的第二行上收到错误。错误的可能原因是因为k1::doFunc2没有为参数指针,而H构造函数中的成员函数指针参数需要它。

当您声明p变量时,第一行也存在一些问题。这是因为ParamType模板类型可以推断为 int int*。原因是因为成员函数指针有ParamType *,而构造函数的第三个参数使用非指针ParamType,但你在这里传递一个指针(&i1)。