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

相关推荐
sm_926787053 小时前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
by209993 小时前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
colinu4 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
wuminyu4 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
longlongzihan5 小时前
链表找环:Floyd 判圈算法(LeetCode 141 & 142 )
c++·算法·leetcode·链表
liulilittle5 小时前
Linux 下 select 测试函数
linux·服务器·网络·数据库·c++·select·c
无忧.芙桃6 小时前
C++语言原理与实践(十二):list类的底层实现
c++·windows·list
沫璃染墨6 小时前
《Linux工程实践篇(二):线程池实战——从线程安全单例到完整源码实现》
linux·开发语言·c++·单例模式·设计模式·系统架构
有只小白叫岳飒6 小时前
c++智能指针 unique_ptr与函数调用
c++
Leo.yuan6 小时前
Kafka+Flink拼凑,还是FineDataLink 5.0一体化?实时数据处理的两种思路
c++·mfc