ROS2 Foxy下C++消息构建器模式报错:auto未推导前使用
ROS2 Foxy 消息构建器模式编译报错的解决思路
环境信息
- 系统:Ubuntu 20.04
- ROS版本:ROS2 Foxy
- 编译器:GCC 9.4.0
- 开发框架:C++ rclcpp节点
构建器模式与传统写法对比
ROS2存在未公开的消息构建器模式,可直接创建不可变的消息对象,对比传统赋值写法如下:
构建器模式示例(以Odometry消息为例)
#include <nav_msgs/msg/odometry.hpp> nav_msgs::msg::Odometry const odom = nav_msgs::build<nav_msgs::msg::Odometry>() .header(std_msgs::msg::Header()) .child_frame_id("") .pose(geometry_msgs::msg::PoseWithCovariance()) .twist(geometry_msgs::msg::TwistWithCovariance()); // 此写法可正常编译运行
传统写法(ROS官方不允许带参数初始化消息对象)
nav_msgs::msg::Odometry odom; // 无法声明为const odom.header = std_msgs::msg::Header(); odom.header.stamp = builtin_interfaces::msg::Time(); // 或使用node.get_clock()->now()赋值 odom.header.frame_id = "..."; // 逐一填充其他成员变量
问题描述
尝试用构建器模式直接为已有消息对象的成员赋值时,触发编译报错:
odom.header = std_msgs::build<std_msgs::msg::Header>() // 报错位置在右括号处 .stamp(node.get_clock()->now()).frame_id("map");
报错内容:
error: use of
auto std_msgs::build() [with MessageType = std_msgs::msg::Header_<std::allocator<void> >]before deduction ofauto
已尝试显式指定类型、引入中间变量等方法,均无法解决该报错。
头文件分析
为排查问题,查看ROS自动生成的头文件内容:
/opt/ros/foxy/include/std_msgs/msg/header.hpp
/// vim /opt/ros/foxy/include/std_msgs/msg/header.hpp // 由rosidl_generator_cpp/resource/idl.hpp.em生成 // 生成代码不含版权声明 #ifndef STD_MSGS__MSG__HEADER_HPP_ #define STD_MSGS__MSG__HEADER_HPP_ #include "std_msgs/msg/detail/header__struct.hpp" #include "std_msgs/msg/detail/header__builder.hpp" #include "std_msgs/msg/detail/header__traits.hpp" #endif // STD_MSGS__MSG__HEADER_HPP_
/opt/ros/foxy/include/std_msgs/msg/detail/header__builder.hpp核心片段
/// vim /opt/ros/foxy/include/std_msgs/msg/detail/header__builder.hpp // ... namespace std_msgs { namespace msg { namespace builder { // 定义了一系列链式调用的构建器类,例如: class Init_Header_stamp { ... }; } // namespace builder } // namespace msg template<typename MessageType> auto build(); template<> inline auto build<::std_msgs::msg::Header>() { return std_msgs::msg::builder::Init_Header_stamp(); } } // namespace std_msgs
尝试复制模板声明并将auto替换为实际类型后,仍出现异常报错,寻求解决思路。
内容的提问来源于stack exchange,提问作者JWCS
相关产品推荐
相关产品推荐

