std线程调用模板成员函数模板类:编译错误

时间:2014-02-07 01:54:20

标签: c++ multithreading c++11

这是代码。它不在vs2013中编译,但在gcc4.8中编译

错误C2665:'std :: thread :: thread':4个重载中没有一个可以转换所有参数类型

由于我使用的是vs2013,任何人都可以提供解决方法吗?

#include <iostream>
#include <thread>

template<typename T> 
class TestClass
{
public:
    TestClass(){};
    ~TestClass(){};

    T  t;

    template<typename U>
    void fun(U u)
    {
        std::cout << "fun: " << u << '\n';
    }
};

int main()
{
    TestClass<double>  A;

    auto aaa = std::thread(&TestClass<double>::fun<int>, &A, 1);
}

2 个答案:

答案 0 :(得分:7)

你可以简单地使用lambda而不是使用成员函数指针进行修改:

auto aaa = thread( [&]{ A.fun(1); } );
aaa.join();

答案 1 :(得分:1)

还有另一种方法可以实现上述问题,如果你愿意的话! 首先看一下线程对象的显式构造函数:

template< class Function, class... Args > 
explicit thread( Function&& f, Args&&... args );

f - 功能对象的通用引用。

args - 函数的可变参数(仿函数) f

(我不会更深入地解释这里使用的可变参数调用)。 所以现在我们知道我们可以处理仿函数, 定义一个仿函数(函数对象),如下所示:

template<typename T>
class TestClass
{
public:
    TestClass(){};
    ~TestClass(){};

    T  t;

    template<typename U>
    void operator()(U u1,U u2){
        std::cout << "fun: " << u1*u2 << '\n';
    }

};
int main()
{
    TestClass<double>  A;
    auto aaa = std::thread(A,1,100);// calling functor A(1,100)
    aaa.join()
    //or if you can move object from main thread to manually created thread aaa ,it's more elegant.
    auto aa = std::thread(std::move(A),1,100);
    aa.join();
    A(1, 99);
    system("Pause");
    return 0;
}

//请注意,我没有使用任何更衣柜防护系统。 如果您使用静态功能,则每次更改预期的运行时行为时都不必绑定相应的实例,因此您必须进行管理,

 template<typename U>
    static void fun(U u)
    {
        std::cout << "fun: " << u << '\n';
    }
then invoke the function,
int main()
{
    TestClass<double>  A;
    auto aaa = std::thread(&TestClass<double>::fun<int>, 1);
    system("Pause");
    return 0;
}