我正在尝试从 std::thread 获取 std::future ,似乎唯一的方法(?)这样做是使用 std::packaged_task 。嗯,另外,我想在std::thread中调用的函数是一个类成员函数。我可以找到这个线程Use member function in std::packaged_task但他们使用 std::async 而不是 std::thread。我试图根据该帖子进行编译,但是当我尝试在此处编译此代码时:
#include <iostream>
#include <future>
#include <thread>
class test
{
int fthread(int b)
{
return a + b;
}
int a;
public:
test(int a_) : a(a_) {}
int run(int b)
{
std::packaged_task<int(int)>
task(std::bind(&test::fthread, this));
//std::thread a(std::move(std::ref(task)), 5, 1);
std::thread th(std::move(std::ref(task)), b);//<--Edit typo...
std::future<int> fut = task.get_future();
return fut.get();
}
};
int main()
{
int a = 5, b = 1;
test t(a);
int c = t.run(b);
if (c != (a+b))
return 1;
return 0;
}
我在 MSVC 2013 上收到以下错误:
error C2064: term does not evaluate to a function taking 1 arguments
class does not define an 'operator()' or a user defined conversion operator to a pointer-to-function or reference-to-function that takes appropriate number of arguments
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(1137) : see reference to function template instantiation 'int std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >::_Do_call<_Ty,0x00>(std::tuple<_Ty &>,std::_Arg_idx<0x00>)' being compiled
1> with
1> [
1> _Ty=int
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(1137) : see reference to function template instantiation 'int std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >::_Do_call<_Ty,0x00>(std::tuple<_Ty &>,std::_Arg_idx<0x00>)' being compiled
1> with
1> [
1> _Ty=int
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\xrefwrap(283) : see reference to function template instantiation 'int std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >::operator ()<_Ty>(_Ty &&)' being compiled
1> with
1> [
1> _Ty=int
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\xrefwrap(283) : see reference to function template instantiation 'int std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >::operator ()<_Ty>(_Ty &&)' being compiled
1> with
1> [
1> _Ty=int
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(228) : see reference to function template instantiation '_Ret std::_Callable_obj<std::_Bind<true,_Ret,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >,false>::_ApplyX<_Rx,_Ty>(_Ty &&)' being compiled
1> with
1> [
1> _Ret=int
1> , _Rx=int
1> , _Ty=int
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(228) : see reference to function template instantiation '_Ret std::_Callable_obj<std::_Bind<true,_Ret,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >,false>::_ApplyX<_Rx,_Ty>(_Ty &&)' being compiled
1> with
1> [
1> _Ret=int
1> , _Rx=int
1> , _Ty=int
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(226) : while compiling class template member function 'int std::_Func_impl<_MyWrapper,_Alloc,_Ret,int>::_Do_call(int &&)'
1> with
1> [
1> _Alloc=std::allocator<std::_Func_class<int,int>>
1> , _Ret=int
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(495) : see reference to class template instantiation 'std::_Func_impl<_MyWrapper,_Alloc,_Ret,int>' being compiled
1> with
1> [
1> _Alloc=std::allocator<std::_Func_class<int,int>>
1> , _Ret=int
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(396) : see reference to function template instantiation 'void std::_Func_class<_Ret,int>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Alloc=std::allocator<std::_Func_class<int,int>>
1> , _Fty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(396) : see reference to function template instantiation 'void std::_Func_class<_Ret,int>::_Do_alloc<_Myimpl,_Ty,_Alloc>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Alloc=std::allocator<std::_Func_class<int,int>>
1> , _Fty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(385) : see reference to function template instantiation 'void std::_Func_class<_Ret,int>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,int>>>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Fty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Alloc=std::allocator<std::_Func_class<int,int>>
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(385) : see reference to function template instantiation 'void std::_Func_class<_Ret,int>::_Reset_alloc<_Ty,std::allocator<std::_Func_class<_Ret,int>>>(_Fty &&,_Alloc)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Fty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Alloc=std::allocator<std::_Func_class<int,int>>
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(671) : see reference to function template instantiation 'void std::_Func_class<_Ret,int>::_Reset<_Ty>(_Fty &&)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Fty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\functional(671) : see reference to function template instantiation 'void std::_Func_class<_Ret,int>::_Reset<_Ty>(_Fty &&)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Fty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\future(588) : see reference to function template instantiation 'std::function<_Ret (int)>::function<_Ty>(_Fx &&)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Fx=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\future(588) : see reference to function template instantiation 'std::function<_Ret (int)>::function<_Ty>(_Fx &&)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Fx=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\future(1742) : see reference to function template instantiation 'std::_Packaged_state<_Ret (int)>::_Packaged_state<_Ty>(_Fty2 &&)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Fty2=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> C:\MesProgs\Microsoft Visual Studio 12.0\VC\include\future(1744) : see reference to function template instantiation 'std::_Packaged_state<_Ret (int)>::_Packaged_state<_Ty>(_Fty2 &&)' being compiled
1> with
1> [
1> _Ret=int
1> , _Ty=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> , _Fty2=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> main.cpp(51) : see reference to function template instantiation 'std::packaged_task<int (int)>::packaged_task<std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >>(_Fty2 &&)' being compiled
1> with
1> [
1> _Fty2=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
1> main.cpp(51) : see reference to function template instantiation 'std::packaged_task<int (int)>::packaged_task<std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >>(_Fty2 &&)' being compiled
1> with
1> [
1> _Fty2=std::_Bind<true,int,std::_Pmf_wrap<int (__cdecl test::* )(int),int,test,int>,test *const >
1> ]
我会很感激任何帮助!谢谢