-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Description
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) |
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.