C ++, Linux: ошибка: запрошено преобразование из «boost :: unique_future <void>» в нескалярный тип «boost :: shared_future <void>». как обойти это? - PullRequest
5 голосов
/ 31 августа 2011

Я пытаюсь работать с буст-фьючерсами на нити . Таким образом, как показано здесь , мы можем получить общее будущее из упакованного задания .

Так что я попробую такую ​​функцию на 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

Я не брал ни одного будущего из этой задачи раньше. весь исходный код , место, куда я звоню из , моего пула потоков, который вызывается . А в Windows под Visual Studio 2010 он компилируется и работает отлично.

Что мне делать? как исправить или обойти эту ошибку?

Ответы [ 4 ]

4 голосов
/ 26 декабря 2011

Преобразование из unique_future в shared_future использует следующий конструктор в документации :

shared_future(unique_future<R> && other);

При этом используется ссылка rvalue, чтобы убедиться, что она ясна в исходном кодечто вы намеревались уничтожить ценность «другого».Вполне возможно, что VC ++ 2010 по умолчанию предоставляет достаточно поддержки ссылок на rvalue, чтобы поддерживать это напрямую, в то время как компилятору, который вы используете в linux (вероятно, gcc), требуется дополнительный флаг, такой как -std=gnu++0x, для его поддержки.Без этого флага boost возвращается к «эмуляции перемещения», которая может (я не проверял это) потребовать от вас написать:

boost::shared_future<task_return_t> fi = boost::move(pt->get_future());
1 голос
/ 03 мая 2012

Джеффри Яскин прав. Функция компилируется с g ++ (4.6.3) в Linux с флагом -std = gnu ++ 0x или с флагом -std = c ++ 0x, если вы хотите строго компилировать ISO. Эти флаги -std устарели в пользу gnu ++ 11 и c ++ 11 соответственно. (Я только что сделал этот комментарий, но у меня еще не было достаточных привилегий)

0 голосов
/ 29 апреля 2012

В C ++ 11 вы должны вызывать std :: future :: share (), чтобы получить shared_future из будущего. Например.,

auto sf=std::async([]{/* something */}).share();
0 голосов
/ 04 сентября 2011

Возможно, вы забыли включить правильные заголовки?

Если нет, то работает ли другой конструктор, такой как приведенный ниже?

boost::shared_future<task_return_t> fi(pt->get_future());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...