Vineet, > > I am trying to return an object of a component client from an action > > defined in another component. Passing the same object in action as > > argument seems to work fine, but returning produces an error. What is > the > > correct way of doing it ? > > This appears to be a bug. I created a ticket for this > (https://github.com/STEllAR-GROUP/hpx/issues/2420) and will try provide a > fix as soon as possible.
I added a comment explaining the issue to the ticket here: https://github.com/STEllAR-GROUP/hpx/issues/2420#issuecomment-265029505 HTH Regards Hartmut --------------- http://boost-spirit.com http://stellar.cct.lsu.edu > > Thanks! > Regards Hartmut > --------------- > http://boost-spirit.com > http://stellar.cct.lsu.edu > > > > > > Minimal code for what I want : > > > > #include <hpx/hpx_init.hpp> > > #include <hpx/include/actions.hpp> > > #include <hpx/include/components.hpp> > > > > #include <utility> > > > > struct foo_server : public hpx::components::component_base<foo_server> > > { > > }; > > > > using foo_server_type = hpx::components::component<foo_server>; > > HPX_REGISTER_COMPONENT(foo_server_type, foo_server); > > > > struct foo : public hpx::components::client_base<foo, foo_server> > > { > > public: > > using base_type = hpx::components::client_base<foo, foo_server>; > > > > foo() = default; > > > > foo(hpx::id_type id) : base_type(std::move(id)) > > { > > } > > > > }; > > > > struct bar_server : public hpx::components::component_base<bar_server> > > { > > foo get_foo() { > > //return hpx::new_<foo_server>(hpx::find_here()); > > return foo(hpx::find_here()); > > } > > HPX_DEFINE_COMPONENT_DIRECT_ACTION(bar_server, get_foo, > > get_foo_action); > > }; > > using bar_server_type = hpx::components::component<bar_server>; > > HPX_REGISTER_COMPONENT(bar_server_type, bar_server); > > > > HPX_REGISTER_ACTION(bar_server::get_foo_action); > > > > struct bar : public hpx::components::client_base<bar, bar_server> > > { > > public: > > using base_type = hpx::components::client_base<bar, bar_server>; > > > > bar() = default; > > > > bar(hpx::id_type id) : base_type(std::move(id)) > > { > > } > > > > hpx::future<foo> get_foo() { > > bar_server::get_foo_action act; > > // This async statement gives compilation error > > return hpx::async(act, hpx::find_here()); > > } > > > > }; > > > > int hpx_main(int, char*[]) > > { > > > > bar b(hpx::find_here()); > > auto res = b.get_foo().get(); > > > > return hpx::finalize(); > > } > > > > int main(int argc, char* argv[]) > > { > > return hpx::init(argc, argv); > > } > > > > Compilation fails with error : > > > > test.cpp: In member function ‘hpx::lcos::future<foo> bar::get_foo()’: > > test.cpp:54:26: error: could not convert ‘hpx::async(F&&, Ts&& ...) > [with > > F = bar_server::get_foo_action&; Ts = {hpx::naming::id_type}; decltype > > (hpx::detail::async_dispatch<type > > name hpx::util::decay<Action>::type>::call(forward<F>(f), > > (forward<Ts>)(hpx::async::ts)...)) = > > hpx::lcos::future<hpx::naming::id_type>; typename > > hpx::util::decay<Action>::type = > > bar_server::get_foo_action](hpx::find_here(hpx::error_code&)())’ from > > ‘hpx::lcos::future<hpx::naming::id_type>’ to ‘hpx::lcos::future<foo>’ > > return hpx::async(act, hpx::find_here()); > > > > > > > > Thanks > > Vineet _______________________________________________ hpx-users mailing list [email protected] https://mail.cct.lsu.edu/mailman/listinfo/hpx-users
