I try to work with boost thread futures. So as shown here we can get shared future from packaged task.
So I try such function on 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
//...
but I get error calling it:
../../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
I did not take any futures from that task before. all source code, place where I do call from, my thread pool that is being called. And on Windows under Visual Studio 2010 it compiles and works perfectly.
What shall I do? how to fix or get around this error?
The conversion from unique_future
to shared_future
uses the following constructor in the documentation:
shared_future(unique_future<R> && other);
This uses an rvalue reference to ensure that it's clear in the source code that you intended to destroy the value of 'other'. It's possible that VC++2010 provides enough rvalue reference support by default to support that directly, while the compiler you're using on linux (probably gcc) requires an extra flag like -std=gnu++0x
to support it. Without that flag, boost falls back to "move emulation", which might (I haven't checked this) require you to write:
boost::shared_future<task_return_t> fi = boost::move(pt->get_future());
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With