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>”: 没有合适的默认构造函数可用
*/
9 个解决方案
#1
Task 的定义发上来。
#2
不好意思,写错了,Task就是variousTask。
#3
std::packaged_task<
void()>
这个void()是什么东西?
这个void()是什么东西?
#4
貌似是 vs 自家的 bug,g++ 和 clang++ 都没问题。
#5
https://connect.microsoft.com/VisualStudio/feedback/details/791185/std-packaged-task-t-where-t-is-void-or-a-reference-class-are-not-movable
bug已经有file了。按照时段推测,update 4 CTP里预计已经修好了。
bug已经有file了。按照时段推测,update 4 CTP里预计已经修好了。
#6
谢谢楼上的回复:
尝试了下面的修改,暂时绕过了这个问题。
尝试了下面的修改,暂时绕过了这个问题。
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;
};
#7
正在安装update 4 RC,安装完成之后会报告解决情况。
#8
问题依然在,没有被解决!不知道是不是我代码中有误!
#9
vs2015 preview 里已经解决了,升级吧,要么换编译器。
#1
Task 的定义发上来。
#2
不好意思,写错了,Task就是variousTask。
#3
std::packaged_task<
void()>
这个void()是什么东西?
这个void()是什么东西?
#4
貌似是 vs 自家的 bug,g++ 和 clang++ 都没问题。
#5
https://connect.microsoft.com/VisualStudio/feedback/details/791185/std-packaged-task-t-where-t-is-void-or-a-reference-class-are-not-movable
bug已经有file了。按照时段推测,update 4 CTP里预计已经修好了。
bug已经有file了。按照时段推测,update 4 CTP里预计已经修好了。
#6
谢谢楼上的回复:
尝试了下面的修改,暂时绕过了这个问题。
尝试了下面的修改,暂时绕过了这个问题。
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;
};
#7
正在安装update 4 RC,安装完成之后会报告解决情况。
#8
问题依然在,没有被解决!不知道是不是我代码中有误!
#9
vs2015 preview 里已经解决了,升级吧,要么换编译器。