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 17:40:13


Le 20/03/13 18:56, Alexander Lamaison a écrit :
> "Vicente J. Botet Escriba" <vicente.botet_at_[hidden]> writes:
>
>> 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.
> This second version is working for me without those two defines. No
> conflicts occuring.
>
Great, glad so see that you have a solution now.

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