Coroutine library has changed a lot in boost 1.55. Now corotine<T> defines *push_type* which is output coroutine type and *pull_type *which is input coroutine type. It determines one directional data transfer. Try code below: typedef boost::coroutines::coroutine< int > coro_t; void get_a_bool( coro_t::push_type& yield ) { while (1) yield(1); } int main(int argc, char *argv[]) { coro_t::pull_type producer( boost::bind(&get_a_bool, _1) ); 2014-04-24 18:56 GMT+02:00 Rob Desbois <rob.desbois@gmail.com>:
(Caveat: I've been unable to find anything about this; hopefully haven't missed anything obvious.) (Apology: I'm aware Coroutine has a new interface as of 1.55; I haven't determined whether it is also affected.)
Given the following code: #include <cassert> #include <boost/bind.hpp> #include <boost/coroutine/coroutine.hpp>
using coro_t = boost::coroutines::coroutine< bool() >;
void get_a_bool( coro_t::caller_type& yield ) { while (true) yield(true); }
int main() { coro_t producer( boost::bind(&get_a_bool, _1) ); assert( producer ); }
I get this error on compilation (g++ 4.8.2, Boost 1.54): rob{code 0} 839# clear && g++ boost-coroutine-bool-return.cpp -g -W -Wall --std=c++11 -L. -lboost_context -lboost_coroutine -o boost-coroutine-bool-return In file included from /usr/include/boost/coroutine/v1/detail/coroutine_base_resume.hpp:26:0, from /usr/include/boost/coroutine/v1/detail/coroutine_base.hpp:21, from /usr/include/boost/coroutine/v1/coroutine.hpp:30, from /usr/include/boost/coroutine/coroutine.hpp:13, from boost-coroutine-bool-return.cpp:11: /usr/include/boost/coroutine/detail/holder.hpp: In instantiation of ‘struct boost::coroutines::detail::holder<bool>’: /usr/include/boost/coroutine/v1/detail/coroutine_base_resume.hpp:103:28: required from ‘void boost::coroutines::detail::coroutine_base_resume<Signature, D, void, 1>::resume(boost::coroutines::detail::coroutine_base_resume<Signature, D, void, 1>::arg_type) [with Signature = void(bool); D = boost::coroutines::detail::coroutine_base<void(bool)>; boost::coroutines::detail::coroutine_base_resume<Signature, D, void, 1>::arg_type = bool]’ /usr/include/boost/coroutine/v1/detail/coroutine_op.hpp:268:9: required from ‘D& boost::coroutines::detail::coroutine_op<Signature, D, void, 1>::operator()(boost::coroutines::detail::coroutine_op<Signature, D, void, 1>::arg_type) [with Signature = void(bool); D = boost::coroutines::coroutine<void(bool), 1>; boost::coroutines::detail::coroutine_op<Signature, D, void, 1>::arg_type = bool]’ boost-coroutine-bool-return.cpp:29:13: required from here /usr/include/boost/coroutine/detail/holder.hpp:39:14: error:
‘boost::coroutines::detail::holder<Data>::holder(boost::coroutines::detail::coroutine_context*, bool) [with Data = bool]’ cannot be overloaded explicit holder( coroutine_context * ctx_, bool force_unwind_) : ^ /usr/include/boost/coroutine/detail/holder.hpp:35:14: error: with
‘boost::coroutines::detail::holder<Data>::holder(boost::coroutines::detail::coroutine_context*, Data) [with Data = bool]’ explicit holder( coroutine_context * ctx_, Data data_) :
At a glance it looks like there's no way a coroutine-function could possibly return bool due to the overload collision. Is this right? Did I miss something completely obvious in the docs?
It's easy enough to work around with a transparent bool wrapper, I just want to be sure I'm not being a muppet :-D
TIA -- rob
-- Rob Desbois http://theotherbranch.wordpress.com/ _______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users