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

相关推荐
rainbow68898 小时前
EffectiveC++入门:四大习惯提升代码质量
c++
秋邱8 小时前
用 Python 写出 C++ 的性能?用CANN中PyPTO 算子开发硬核上手指南
开发语言·c++·python
我在人间贩卖青春8 小时前
C++之析构函数
c++·析构函数
我在人间贩卖青春8 小时前
C++之数据类型的扩展
c++·字符串·数据类型
wangjialelele9 小时前
平衡二叉搜索树:AVL树和红黑树
java·c语言·开发语言·数据结构·c++·算法·深度优先
苏宸啊9 小时前
C++栈和队列
c++
森G9 小时前
七、04ledc-sdk--------makefile有变化
linux·c语言·arm开发·c++·ubuntu
橘颂TA10 小时前
【测试】高效浏览器操作:基础功能与优化设置大全
c++·功能测试·职场和发展·测试·web测试
一只小小的芙厨10 小时前
寒假集训笔记·以点为对象的树形DP
c++·算法
艾莉丝努力练剑10 小时前
hixl vs NCCL:昇腾生态通信库的独特优势分析
运维·c++·人工智能·cann