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++ 的严格类型推导下是不允许的。

相关推荐
星火开发设计2 小时前
C++ 函数定义与调用:程序模块化的第一步
java·开发语言·c++·学习·函数·知识
天赐学c语言3 小时前
1.20 - x的平方根 && vector的扩容机制以及删除元素是否会释放内存
c++·算法·leecode
CC.GG3 小时前
【C++】用哈希表封装myunordered_map和 myunordered_set
java·c++·散列表
xiaoye-duck4 小时前
C++ string 类使用超全攻略(上):创建、遍历及容量操作深度解析
c++·stl
csdn_aspnet4 小时前
C++跨平台开发,分享一些用C++实现多平台兼容的工程难题与解决方案
c++
linweidong5 小时前
C++大型系统中如何组织头文件和依赖树?
java·c++·架构
橘子师兄5 小时前
C++AI大模型接入SDK—环境搭建
开发语言·c++·人工智能
偷星星的贼115 小时前
C++中的状态机实现
开发语言·c++·算法
程序员敲代码吗5 小时前
C++中的组合模式实战
开发语言·c++·算法