error: no matching function for call to ‘ros::NodeHandle::param(const char [11], std::string&, const char [34])’

博客地址:https://www.cnblogs.com/zylyehuo/
系统版本:ROS1 noetic


原始版

复制代码
nh.param("odom_topic", _odom_topic_, "/f_lio_localization_node/Odometry");
  • odom_topic 的类型是 std::string
  • "/f_lio_localization_node/Odometry" 的类型是 const char* (C 风格字符串)

修改版

复制代码
// 显式告诉编译器 T 是 std::string
nh.param<std::string>("odom_topic", _odom_topic_, "/f_lio_localization_node/Odometry");

报错分析

为什么是 const char*?

在 C++ 中,直接在代码中写下用双引号括起来的内容(如 "/f_lio_localization_node/Odometry")时,编译器会将其视为一个字符串字面量。
数据类型:字符串字面量的原始类型在 C++ 中是 const char\[\](字符数组),但在函数传递时,它会自动退化(decay)为 const char*(指向常量字符的指针)。
非对象属性:const char* 是一个 C 风格的原始指针类型,而 std::string 是一个 C++ 类对象。

ros::NodeHandle::param 是一个模板函数

复制代码
// 其声明形式类似于
template <typename T>
void param(const std::string& param_name, T& param_val, const T& default_val);

当编译器尝试解析代码时,它会进行以下对比:
变量 odom_topic:在 .h 文件中定义其类型为 std::string。因此,编译器认为模板参数 T 应该是 std::string。
默认值参数:传入了 "/f_lio_localization_node/Odometry",它的类型是 const char*。
冲突:模板推导要求 param_val 和 default_val 的类型 T 必须严格一致。编译器不会在推导模板参数的过程中自动把 const char* 转换成 std::string。

复制代码
// 虽然在 unitree_control.yaml 中也定义了
odom_topic: "/f_lio_localization_node/Odometry"

但在 C++ 代码编译阶段,编译器只看在 nh.param(...) 中硬编码的那个默认值参数的类型

总结

编译器报错是因为它发现试图让一个 std::string 类型的变量和一个 const char* 类型的默认值共享同一个模板占位符 T,这在 C++ 的严格类型推导下是不允许的。

相关推荐
郝学胜_神的一滴9 小时前
CMake 034:生成器表达式:解耦构建时序、精简分支逻辑的终极利器
c++·cmake
见过夏天1 天前
C++ 基础入门完全指南
c++
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
BadBadBad__AK3 天前
线段树维护区间 k 次方和
c++·数学·算法·stl
卷无止境3 天前
Eigen 库如何借助 OpenMP 加速计算
c++·后端
卷无止境3 天前
OpenMPI、MPICH 与 OpenMP:关系、核心概念与架构全解
c++·后端
郝学胜_神的一滴4 天前
CMake 30:循环语法全解|foreach_while双循环精讲、迭代技巧与实战避坑指南
c++·cmake
卷无止境6 天前
C++ 的Eigen 库全解析
c++
卷无止境6 天前
现代 C++特性大盘点:一门脱胎换骨的老语言
c++·后端
郝学胜_神的一滴6 天前
CMake 27:缓存变量的特性、语法、类型与实操全解
c++·cmake