【问题标题】:C++, Linux: error: conversion from ‘boost::unique_future<void>’ to non-scalar type ‘boost::shared_future<void>’ requested. how to get around it?C++、Linux:错误:请求从“boost::unique_future<void>”转换为非标量类型“boost::shared_future<void>”。如何绕过它?
【发布时间】:2011-08-31 01:06:01
【问题描述】:

我尝试与boost thread futures 合作。所以如图here我们可以从packaged task得到shared future

所以我在linux上尝试了这样的功能:

template <class task_return_t>
void pool_item( boost::shared_ptr< boost::packaged_task<task_return_t> > pt)
{
    boost::shared_future<task_return_t> fi= pt->get_future(); // error
    //...

但我调用它时出错:

../../src/cf-util/thread_pool.h: In member function ‘void thread_pool::pool_item(boost::shared_ptr<boost::packaged_task<R> >) [with task_return_t = void]’:
../../src/cf-util/thread_pool.h:64:3:   instantiated from ‘void thread_pool::post(boost::shared_ptr<boost::packaged_task<R> >) [with task_return_t = void]’
../../src/cf-server/server.cpp:39:27:   instantiated from here
../../src/cf-util/thread_pool.h:124:58: error: conversion from ‘boost::unique_future<void>’ to non-scalar type ‘boost::shared_future<void>’ requested

我之前没有从该任务中获得任何未来。 all source codeplace where I do call frommy thread pool that is being called。在 Visual Studio 2010 下的 Windows 上,它可以完美地编译和运行。

我该怎么办?如何修复或绕过此错误?

【问题讨论】:

  • 可能是版本问题?我可以将 unique_future 转换为 shared_future 就可以了。
  • @Luc Danton:告诉我怎么做,我会试试!)第二个问题是我将任务传递给我的任务管理器,然后将它们发送到这个函数中。所以这里的问题是unique_future 可以已经被占用\分配并在.wait(); 上。
  • 就像您尝试的那样:boost::shared_future&lt;int&gt; f = task.get_future(); 其中taskboost::packaged_task&lt;int&gt; task;。 (您的第二个问题听起来需要一个单独的问题。)

标签: c++ boost scheduled-tasks boost-thread future


【解决方案1】:

unique_futureshared_future 的转换使用the documentation 中的以下构造函数:

shared_future(unique_future<R> && other);

这使用右值引用来确保在源代码中清楚地表明您打算破坏“其他”的值。默认情况下,VC++2010 可能提供足够的右值引用支持来直接支持它,而您在 linux 上使用的编译器(可能是 gcc)需要一个额外的标志,如 -std=gnu++0x 来支持它。如果没有那个标志,boost 会退回到“移动仿真”,这可能(我没有检查过)需要你写:

boost::shared_future<task_return_t> fi = boost::move(pt->get_future());

【讨论】:

    【解决方案2】:

    杰弗里·亚斯金是正确的。该函数在 Linux 上使用 g++ (4.6.3) 编译,带有 -std=gnu++0x 标志,或者如果您想要严格的 ISO 编译,则使用 -std=c++0x 标志。这些 -std 标志现在已弃用,分别支持 gnu++11 和 c++11。 (我刚刚对此发表了评论,但还没有足够的权限)

    【讨论】:

    • -std=gnu++11 仅支持 gcc-4.7 及更高版本和 clang-3.0 或 -3.1 及更高版本,所以我还没有决定我更喜欢代码使用它还是“ 0x”的拼写。从长远来看,是的,“11”拼写将是首选。
    【解决方案3】:

    您是否可能忘记包含正确的标题?

    如果没有,像下面这样的不同构造函数是否有效?

    boost::shared_future<task_return_t> fi(pt->get_future());
    

    【讨论】:

      【解决方案4】:

      在 C++11 中,您应该调用 std::future::share() 从未来获取 shared_future。例如,

      auto sf=std::async([]{/* something */}).share();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        • 2015-12-01
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        相关资源
        最近更新 更多