Boost logo

Boost Users :

Subject: Re: [Boost-users] [thread][move] compiling move(thread) with Android NDK GCC4.7
From: Jeffrey Lee Hellrung, Jr. (jeffrey.hellrung_at_[hidden])
Date: 2013-01-14 12:36:17


On Mon, Jan 14, 2013 at 5:43 AM, Igor R <boost.lists_at_[hidden]> wrote:

> Hello,
>
> I'm building my project with Android NDK toolchain (Boost1.51, GCC4.6
> or GCC4.7), and I get the following error when trying to move thread.
> Is there any workaround for this issue?
>
> //...
> vector_.push_back(boost::move(thread(&func, arg)));
> //...
>

I believe you can only "boost::move" an lvalue. Aside from that, if you're
using a C++03 std::vector, I don't think it'll be aware of the move
semantics of boost::thread (just guessing on the types of your variables
though, since you didn't spell them out), so I would expect this to trigger
an error somewhere inside vector::push_back even if the move call compiled.

try.cpp:86:62: error: no matching function for call to 'move(boost::thread)'
> try.cpp:86:62: note: candidates are:
> In file included from boost/thread/detail/move.hpp:20:0,
> from boost/thread/locks.hpp:11,
> from boost/thread/pthread/mutex.hpp:12,
> from boost/thread/mutex.hpp:16,
> from boost/thread/pthread/thread_data.hpp:13,
> from boost/thread/thread.hpp:17,
> from boost/thread.hpp:13,
> from try.h:3,
> from try.cpp:6:
> boost/move/move.hpp:324:97: note: template<class T> typename
> boost::move_detail::disable_if<boost::has_move_emulation_enabled_aux<T>,
> T&>::type boost::move(T&)
> boost/move/move.hpp:324:97: note: template argument
> deduction/substitution failed:
> boost/move/move.hpp: In substitution of 'template<class T> typename
> boost::move_detail::disable_if<boost::has_move_emulation_enabled_aux<T>,
> T&>::type boost::move(T&) [with T = boost::thread]':
> try.cpp:86:62: required from here
> boost/move/move.hpp:324:97: error: no type named 'type' in 'struct
>
> boost::move_detail::disable_if<boost::has_move_emulation_enabled_aux<boost::thread>,
> boost::thread&>'
> boost/move/move.hpp:330:96: note: template<class T> typename
> boost::move_detail::enable_if<boost::has_move_emulation_enabled<T>,
> boost::rv<T>&>::type boost::move(T&)
> boost/move/move.hpp:330:96: note: template argument
> deduction/substitution failed:
> boost/move/move.hpp: In substitution of 'template<class T> typename
> boost::move_detail::enable_if<boost::has_move_emulation_enabled<T>,
> boost::rv<T>&>::type boost::move(T&) [with T = boost::thread]':
> try.cpp:86:62: required from here
> boost/move/move.hpp:330:96: error: no type named 'type' in 'struct
>
> boost::move_detail::enable_if<boost::has_move_emulation_enabled<boost::thread>,
> boost::rv<boost::thread>&>'
>

I'm a little surprised by this diagnostic (I would've thought
has_move_emulation_enabled<boost::thread>::value == true); hmmm...

> boost/move/move.hpp:336:96: note: template<class T> typename
> boost::move_detail::enable_if<boost::has_move_emulation_enabled<T>,
> boost::rv<T>&>::type boost::move(boost::rv<T>&)
> boost/move/move.hpp:336:96: note: template argument
> deduction/substitution failed:
> try.cpp:86:62: note: 'boost::thread' is not derived from 'boost::rv<T>'
> In file included from boost/thread/detail/move.hpp:20:0,
> from boost/thread/locks.hpp:11,
> from boost/thread/pthread/mutex.hpp:12,
> from boost/thread/mutex.hpp:16,
> from boost/thread/pthread/thread_data.hpp:13,
> from boost/thread/thread.hpp:17,
> from boost/thread.hpp:13,
> from try.h:3,
> from try.cpp:6:
> boost/move/move.hpp:943:6: note: template<class I, class O> O
> boost::move(I, I, O)
> boost/move/move.hpp:943:6: note: template argument
> deduction/substitution failed:
> try.cpp:86:62: note: candidate expects 3 arguments, 1 provided
> In file included from boost/thread/locks.hpp:11:0,
> from boost/thread/pthread/mutex.hpp:12,
> from boost/thread/mutex.hpp:16,
> from boost/thread/pthread/thread_data.hpp:13,
> from boost/thread/thread.hpp:17,
> from boost/thread.hpp:13,
> from try.h:3,
> from try.cpp:6:
> boost/thread/detail/move.hpp:55:124: note: typename
> boost::enable_if<boost::is_convertible<T&,
> boost::detail::thread_move_t<T> >, boost::detail::thread_move_t<T>
> >::type boost::move(T&) [with T = boost::thread; typename
> boost::enable_if<boost::is_convertible<T&,
> boost::detail::thread_move_t<T> >, boost::detail::thread_move_t<T>
> >::type = boost::detail::thread_move_t<boost::thread>]
> boost/thread/detail/move.hpp:55:124: note: no known conversion for
> argument 1 from 'boost::thread' to 'boost::thread&'
>

Oh, okay, I guess boost::thread has its own move emulation infrastructure
distinct from Boost.Move :( Still, first comment above still applies.

In file included from boost/thread/locks.hpp:11:0,
> from boost/thread/pthread/mutex.hpp:12,
> from boost/thread/mutex.hpp:16,
> from boost/thread/pthread/thread_data.hpp:13,
> from boost/thread/thread.hpp:17,
> from boost/thread.hpp:13,
> from try.h:3,
> from try.cpp:6:
> boost/thread/detail/move.hpp:62:37: note: template<class T>
> boost::detail::thread_move_t<T>
> boost::move(boost::detail::thread_move_t<T>)
> boost/thread/detail/move.hpp:62:37: note: template argument
> deduction/substitution failed:
> try.cpp:86:62: note: 'boost::thread' is not derived from
> 'boost::detail::thread_move_t<T>'
>

HTH,

- Jeff



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