Skip to content

action client C++ tutorial fails #2736

@filchristou

Description

@filchristou

The tutorial example https://docs.ros.org/en/humble/Tutorials/Actions/Writing-a-Cpp-Action-Server-Client.html#writing-the-action-client-code is failing to compile for humble.

The error is :

/home/pakis/buzy/ros-doc-tutorial/action_ws/src/action_tutorials_cpp/src/fibonacci_action_client.cpp: In member function ‘void action_tutorials_cpp::FibonacciActionClient::send_goal()’:
/home/pakis/buzy/ros-doc-tutorial/action_ws/src/action_tutorials_cpp/src/fibonacci_action_client.cpp:53:73: error: no match for ‘operator=’ (operand types are ‘rclcpp_action::Client<action_tutorials_interfaces::action::Fibonacci>::GoalResponseCallback’ {aka ‘std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>’} and ‘std::_Bind_helper<false, void (action_tutorials_cpp::FibonacciActionClient::*)(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >), action_tutorials_cpp::FibonacciActionClient*, const std::_Placeholder<1>&>::type’)
   53 |       std::bind(&FibonacciActionClient::goal_response_callback, this, _1);
      |                                                                         ^
In file included from /usr/include/c++/11/functional:59,
                 from /home/pakis/buzy/ros-doc-tutorial/action_ws/src/action_tutorials_cpp/src/fibonacci_action_client.cpp:1:
/usr/include/c++/11/bits/std_function.h:530:9: note: candidate: ‘template<class _Functor> std::function<_Res(_ArgTypes ...)>::_Requires<std::function<_Res(_ArgTypes ...)>::_Callable<_Functor>, std::function<_Res(_ArgTypes ...)>&> std::function<_Res(_ArgTypes ...)>::operator=(_Functor&&) [with _Functor = _Functor; _Res = void; _ArgTypes = {std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >}]’
  530 |         operator=(_Functor&& __f)
      |         ^~~~~~~~
/usr/include/c++/11/bits/std_function.h:530:9: note:   template argument deduction/substitution failed:
In file included from /usr/include/c++/11/bits/move.h:57,
                 from /usr/include/c++/11/bits/stl_function.h:60,
                 from /usr/include/c++/11/functional:49,
                 from /home/pakis/buzy/ros-doc-tutorial/action_ws/src/action_tutorials_cpp/src/fibonacci_action_client.cpp:1:
/usr/include/c++/11/type_traits: In substitution of ‘template<bool _Cond, class _Tp> using __enable_if_t = typename std::enable_if::type [with bool _Cond = false; _Tp = std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>&]’:
/usr/include/c++/11/bits/std_function.h:353:8:   required by substitution of ‘template<class _Res, class ... _ArgTypes> template<class _Cond, class _Tp> using _Requires = std::__enable_if_t<_Cond::value, _Tp> [with _Cond = std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>::_Callable<std::_Bind<void (action_tutorials_cpp::FibonacciActionClient::*(action_tutorials_cpp::FibonacciActionClient*, std::_Placeholder<1>))(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >)>, std::_Bind<void (action_tutorials_cpp::FibonacciActionClient::*(action_tutorials_cpp::FibonacciActionClient*, std::_Placeholder<1>))(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >)>, std::__invoke_result<std::_Bind<void (action_tutorials_cpp::FibonacciActionClient::*(action_tutorials_cpp::FibonacciActionClient*, std::_Placeholder<1>))(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >)>&, std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > > >; _Tp = std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>&; _Res = void; _ArgTypes = {std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >}]’
/usr/include/c++/11/bits/std_function.h:530:2:   required by substitution of ‘template<class _Functor> std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>::_Requires<std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>::_Callable<_Functor, typename std::enable_if<(! std::is_same<typename std::remove_cv<typename std::remove_reference<_Tp>::type>::type, std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)> >::value), std::decay<_Tp> >::type::type, std::__invoke_result<typename std::enable_if<(! std::is_same<typename std::remove_cv<typename std::remove_reference<_Tp>::type>::type, std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)> >::value), std::decay<_Tp> >::type::type&, std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > > >, std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>&> std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>::operator=<_Functor>(_Functor&&) [with _Functor = std::_Bind<void (action_tutorials_cpp::FibonacciActionClient::*(action_tutorials_cpp::FibonacciActionClient*, std::_Placeholder<1>))(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >)>]’
/home/pakis/buzy/ros-doc-tutorial/action_ws/src/action_tutorials_cpp/src/fibonacci_action_client.cpp:53:73:   required from here
/usr/include/c++/11/type_traits:2211:11: error: no type named ‘type’ in ‘struct std::enable_if<false, std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>&>’
 2211 |     using __enable_if_t = typename enable_if<_Cond, _Tp>::type;
      |           ^~~~~~~~~~~~~
In file included from /usr/include/c++/11/functional:59,
                 from /home/pakis/buzy/ros-doc-tutorial/action_ws/src/action_tutorials_cpp/src/fibonacci_action_client.cpp:1:
/usr/include/c++/11/bits/std_function.h:540:9: note: candidate: ‘template<class _Functor> std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::reference_wrapper<_Functor>) [with _Functor = _Functor; _Res = void; _ArgTypes = {std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >}]’
  540 |         operator=(reference_wrapper<_Functor> __f) noexcept
      |         ^~~~~~~~
/usr/include/c++/11/bits/std_function.h:540:9: note:   template argument deduction/substitution failed:
/home/pakis/buzy/ros-doc-tutorial/action_ws/src/action_tutorials_cpp/src/fibonacci_action_client.cpp:53:73: note:   ‘std::_Bind<void (action_tutorials_cpp::FibonacciActionClient::*(action_tutorials_cpp::FibonacciActionClient*, std::_Placeholder<1>))(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >)>’ is not derived from ‘std::reference_wrapper<_Tp>’
   53 |       std::bind(&FibonacciActionClient::goal_response_callback, this, _1);
      |                                                                         ^
In file included from /usr/include/c++/11/functional:59,
                 from /home/pakis/buzy/ros-doc-tutorial/action_ws/src/action_tutorials_cpp/src/fibonacci_action_client.cpp:1:
/usr/include/c++/11/bits/std_function.h:469:7: note: candidate: ‘std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(const std::function<_Res(_ArgTypes ...)>&) [with _Res = void; _ArgTypes = {std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >}]’
  469 |       operator=(const function& __x)
      |       ^~~~~~~~
/usr/include/c++/11/bits/std_function.h:469:33: note:   no known conversion for argument 1 from ‘std::_Bind_helper<false, void (action_tutorials_cpp::FibonacciActionClient::*)(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >), action_tutorials_cpp::FibonacciActionClient*, const std::_Placeholder<1>&>::type’ to ‘const std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>&’
  469 |       operator=(const function& __x)
      |                 ~~~~~~~~~~~~~~~~^~~
/usr/include/c++/11/bits/std_function.h:487:7: note: candidate: ‘std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::function<_Res(_ArgTypes ...)>&&) [with _Res = void; _ArgTypes = {std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >}]’
  487 |       operator=(function&& __x) noexcept
      |       ^~~~~~~~
/usr/include/c++/11/bits/std_function.h:487:28: note:   no known conversion for argument 1 from ‘std::_Bind_helper<false, void (action_tutorials_cpp::FibonacciActionClient::*)(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >), action_tutorials_cpp::FibonacciActionClient*, const std::_Placeholder<1>&>::type’ to ‘std::function<void(std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >)>&&’
  487 |       operator=(function&& __x) noexcept
      |                 ~~~~~~~~~~~^~~
/usr/include/c++/11/bits/std_function.h:501:7: note: candidate: ‘std::function<_Res(_ArgTypes ...)>& std::function<_Res(_ArgTypes ...)>::operator=(std::nullptr_t) [with _Res = void; _ArgTypes = {std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> >}; std::nullptr_t = std::nullptr_t]’
  501 |       operator=(nullptr_t) noexcept
      |       ^~~~~~~~
/usr/include/c++/11/bits/std_function.h:501:17: note:   no known conversion for argument 1 from ‘std::_Bind_helper<false, void (action_tutorials_cpp::FibonacciActionClient::*)(std::shared_future<std::shared_ptr<rclcpp_action::ClientGoalHandle<action_tutorials_interfaces::action::Fibonacci> > >), action_tutorials_cpp::FibonacciActionClient*, const std::_Placeholder<1>&>::type’ to ‘std::nullptr_t’
  501 |       operator=(nullptr_t) noexcept
      |                 ^~~~~~~~~
gmake[2]: *** [CMakeFiles/action_client.dir/build.make:76: CMakeFiles/action_client.dir/src/fibonacci_action_client.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:195: CMakeFiles/action_client.dir/all] Error 2
gmake: *** [Makefile:146: all] Error 2
---
Failed   <<< action_tutorials_cpp [7.67s, exited with code 2]

Essentially the error is that in Foxy the GoalResponseCallback is defined like a shared_future https://github.com/ros2/rclcpp/blob/48ec78cb24eef4c902ce0c27f7934b01d34d5b67/rclcpp_action/include/rclcpp_action/client.hpp#L264

While in Humble it is defined as a SharedPtr : https://github.com/ros2/rclcpp/blob/cf2a27805e7a5daf79b890ad9ece0f95c9ce172c/rclcpp_action/include/rclcpp_action/client.hpp#L345

When I update the defined callback function signature here

void goal_response_callback(std::shared_future<GoalHandleFibonacci::SharedPtr> future)
to

void goal_response_callback(GoalHandleFibonacci::SharedPtr future)

it compiles normally.

However, I am very new to the ecosystem and I am not sure if further adaptations need to be made.

Metadata

Metadata

Assignees

No one assigned

    Labels

    backport-humblebackport at reviewers discretion; from rolling to humble

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions