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.

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

Reply via email to