Boost logo

Boost Users :

Subject: Re: [Boost-users] [Thread] Constructing a move-only object asyncronously
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2013-03-19 15:09:25


Le 19/03/13 19:40, Alexander Lamaison a écrit :
> I'm trying to create a move-only object asyncronously using Boost.Thread
> unique_future but I'm running into trouble:
>
> error C2248: 'A::A' : cannot access private member declared in class 'A'
> c:\users\awl03\documents\visual studio
> 2005\projects\boost_1_51_0\boost\thread\future.hpp 493
>
> I've tried all sorts of ways to work around this but always end up with
> some variation or other of this error message. What am I doing wrong?
>
> The code is below. The setup is:
> Visual Studio 2005
> Boost 1.51
>
> Thanks,
> Alex
>
>
> #include <boost/noncopyable.hpp>
> #include <boost/move/move.hpp>
> #include <boost/thread/future.hpp>
> #include <boost/thread/thread.hpp>
>
> using namespace boost;
>
> class A : public noncopyable
> {
> BOOST_MOVABLE_BUT_NOT_COPYABLE(A)
>
> public:
> A(int i) {}
>
> A(BOOST_RV_REF(A) other) {}
>
> A& operator=(BOOST_RV_REF(A) other) {}
>
> };
>
> A create_a()
> {
> return A(42);
> }
>
> unique_future<A> async_create_a()
> {
> packaged_task<A> task(create_a);
> unique_future<A> result = task.get_future();
> thread(move(task)).detach();
> return move(result);
> }
>
> int main()
> {
> A a = async_create_a().get();
> return 0;
> }
>
>
>
Hi,

you need to use version 4 to got this functionality. I have modified
your example to use boost::future (*) and use packaged_task with a
signature parameter (**). With this change it to works for the following
toolsets.

  bjam
toolset=darwin,darwin-4.6.2,darwin-4.7.1,clang-3.1,clang-3.2,darwin-latest,darwin-4.7.2
-l 300 variant=debug -j6
bjam
toolset=darwin,darwin-4.6.2,darwin-4.7.1,clang-3.1,clang-3.2,darwin-latest,darwin-4.7.2
-l 300 variant=debug -j6 ts_
iMac-de-Vicente-Botet-Escriba:test viboes$

Best,
Vicente

#define BOOST_THREAD_VERSION 4

#include <boost/noncopyable.hpp>
#include <boost/move/move.hpp>
#include <boost/thread/future.hpp>
#include <boost/thread/thread.hpp>

using namespace boost;

class A : public noncopyable
{
BOOST_MOVABLE_BUT_NOT_COPYABLE(A)

public:
     A(int ) {}

     A(BOOST_RV_REF(A) ) {}

     A& operator=(BOOST_RV_REF(A) ) { return *this;}

};

A create_a()
{
     return A(42);
}

future<A> async_create_a() //*
{
     packaged_task<A()> task(create_a); // **
     future<A> result = task.get_future(); //*
     thread(move(task)).detach();
     return move(result);
}

int main()
{
     A a = async_create_a().get();
     return 0;
}


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net