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

时间:2022-02-25 17:44:15
直接上代码:

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()是什么东西?

#4


貌似是 vs 自家的 bug,g++ 和 clang++ 都没问题。

#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()是什么东西?

#4


貌似是 vs 自家的 bug,g++ 和 clang++ 都没问题。

#5


#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 里已经解决了,升级吧,要么换编译器。