64,654
社区成员
发帖
与我相关
我的任务
分享
template<typename R>
class VariousTask
{
public:
typedef std::packaged_task<R()> PackagedTask;
VariousTask(PackagedTask&& _rhs) throw()
: task_package(std::move(_rhs))
{
}
private:
PackagedTask task_package;
};
class op
{
public:
void mul(int a, int b)
{
std::cout << a * b << std::endl;
}
};
int main()
{
op o;
std::packaged_task<void()> pt(std::bind(&op::mul, &o, 1, 2)); //正确
std::packaged_task<void()> f(std::packaged_task<void()>(std::bind(&op::mul, &o, 1, 2))); //正确
Task<void> g(std::packaged_task<void()>(std::bind(&op::mul, &o, 1, 2))); //错误
}
/*
错误代码:
main.cpp
1>c:\program files\microsoft visual studio 12.0\vc\include\future(1014): error C2182: “_Get_value”: 非法使用“void”类型
1> c:\program files\microsoft visual studio 12.0\vc\include\future(1466): 参见对正在编译的类 模板 实例化“std::_State_manager<_Ty>”的引用
1> with
1> [
1> _Ty=void
1> ]
1> c:\program files\microsoft visual studio 12.0\vc\include\future(1747): 参见对正在编译的类 模板 实例化“std::_Promise<_Ret>”的引用
1> with
1> [
1> _Ret=void
1> ]
1> c:\program files\microsoft visual studio 12.0\vc\include\future(1747): 编译类 模板 成员函数“std::packaged_task<void (void)>::packaged_task(std::packaged_task<void (void)> &&) throw()”时
1> e:\win32project1\win32project1\main.cpp(12): 参见对正在编译的函数 模板 实例化“std::packaged_task<void (void)>::packaged_task(std::packaged_task<void (void)> &&) throw()”的引用
1> e:\win32project1\win32project1\main.cpp(33): 参见对正在编译的类 模板 实例化“std::packaged_task<void (void)>”的引用
1>c:\program files\microsoft visual studio 12.0\vc\include\future(1021): error C2182: “_Val”: 非法使用“void”类型
1>c:\program files\microsoft visual studio 12.0\vc\include\future(1029): error C2182: “_Val”: 非法使用“void”类型
1>c:\program files\microsoft visual studio 12.0\vc\include\future(1747): error C2665: “std::forward”: 2 个重载中没有一个可以转换所有参数类型
1> c:\program files\microsoft visual studio 12.0\vc\include\type_traits(1509): 可能是“_Ty &&std::forward<std::_Promise<_Ret>>(std::_Promise<_Ret> &&) throw()”
1> with
1> [
1> _Ty=std::_Promise<void>
1> , _Ret=void
1> ]
1> c:\program files\microsoft visual studio 12.0\vc\include\type_traits(1503): 或 “_Ty &&std::forward<std::_Promise<_Ret>>(std::_Promise<_Ret> &)”
1> with
1> [
1> _Ty=std::_Promise<void>
1> , _Ret=void
1> ]
1> 尝试匹配参数列表“(std::_Promise<int>)”时
1>c:\program files\microsoft visual studio 12.0\vc\include\future(1749): error C2512: “std::_Promise<int>”: 没有合适的默认构造函数可用
*/
template<typename R>
class Task
{
public:
typedef std::packaged_task<R()> PackagedTask;
Task(PackagedTask&& _rhs) throw()
{
task_package = (std::forword<PackagedTask>(_rhs));
}
private:
PackagedTask task_package;
};