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-20 08:41:12


Le 20/03/13 13:26, Vicente J. Botet Escriba a écrit :
> Le 20/03/13 00:22, Alexander Lamaison a écrit :
>> "Vicente J. Botet Escriba" <vicente.botet_at_[hidden]> writes:
>>
>>> Le 19/03/13 20:30, Alexander Lamaison a écrit :
>>>> "Vicente J. Botet Escriba" <vicente.botet_at_[hidden]> writes:
>>>>
>>>>> 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?
>>>>>>
>>>> snip
>>>>
>>>>> you need to use version 4 to got this functionality.
>>>> I assume this requires Boost 1.53?
>>>>
>>>>> 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.
>>>> Thanks! Can you give me an idea of what changed in v4 to enable this?
>>>> I've looked through the history but nothing stands out.
>>>>
>>>> I tried to make it work using just class thread rather than
>>>> anything in
>>>> <future.hpp>, but I couldn't work out how for a non-default
>>>> constructible class.
>>>>
>>>>
>>> I have just tried your example defining
>>>
>>> #define BOOST_THREAD_USES_MOVE
>>>
>>> and it works also.
>> Perfect. Thanks :)
>>
>> I'm assuming this solves the problem because the previous
>> thread-internal move emulation didn't realise class A was movable and so
>> tried to copy it. Is that right?
>>
>>
> Yes, your code declared a move only class using the Boost.Move
> emulation. Boost.Thread has defined equivalent macros that use both
> emulations. Could you try with the following without defining
> BOOST_THREAD_USES_MOVE
>
> //#define BOOST_THREAD_USES_MOVE
>
>
> class A : public noncopyable
> {
> BOOST_THREAD_MOVABLE_ONLY(A)
>
> public:
> A(int ) {}
>
> A(BOOST_THREAD_RV_REF(A) ) {}
>
> A& operator=(BOOST_THREAD_RV_REF(A) ) { return *this;}
>
> };
>

Ah, you will need to add

BOOST_THREAD_DCL_MOVABLE_BEG(T) A BOOST_THREAD_DCL_MOVABLE_END

so that there is no conflict with Boost.Move.

HTH,
Vicente


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