求教,C++ 11 std::packaged_task 作为类成员的问题

shilei_312 2014-11-02 01:44:48
直接上代码:

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>”: 没有合适的默认构造函数可用
*/
...全文
243 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2014-11-04
  • 打赏
  • 举报
回复
vs2015 preview 里已经解决了,升级吧,要么换编译器。
shilei_312 2014-11-03
  • 打赏
  • 举报
回复
正在安装update 4 RC,安装完成之后会报告解决情况。
shilei_312 2014-11-03
  • 打赏
  • 举报
回复
谢谢楼上的回复: 尝试了下面的修改,暂时绕过了这个问题。

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;
};
FancyMouse 2014-11-03
  • 打赏
  • 举报
回复
shilei_312 2014-11-03
  • 打赏
  • 举报
回复
问题依然在,没有被解决!不知道是不是我代码中有误!
ri_aje 2014-11-03
  • 打赏
  • 举报
回复
貌似是 vs 自家的 bug,g++ 和 clang++ 都没问题。
勤奋的小游侠 2014-11-02
  • 打赏
  • 举报
回复
std::packaged_task<void()> 这个void()是什么东西?
shilei_312 2014-11-02
  • 打赏
  • 举报
回复
不好意思,写错了,Task就是variousTask。
ri_aje 2014-11-02
  • 打赏
  • 举报
回复
Task 的定义发上来。

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧