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++11 核心特性(三):强类型枚举、static_assert 与 std::tuple
开发语言·c++
一拳一个呆瓜3 小时前
【STL】C++程序的启动与终止
c++·stl
凡人叶枫3 小时前
Effective C++ 条款07:为多态基类声明 virtual 析构函数
linux·c语言·开发语言·c++
凡人叶枫3 小时前
Effective C++ 条款10:令 operator= 返回一个 reference to *this
java·linux·服务器·开发语言·c++·effective c++
王老师青少年编程3 小时前
2026年全国青少年信息素养大赛算法应用主题赛(C++赛项-复赛模拟卷6:文末附答案)
c++·答案·模拟卷·复赛·2026年·青少年信息素养大赛·算法应用主题赛
视觉小萌新4 小时前
C++利用libmicrohttpd制作交互网页端——C1
java·c++·交互
fpcc4 小时前
C++编程实践—C++实现类似Qt的信号槽机制
c++·qt
格发许可优化管理系统4 小时前
Mentor许可证使用规定全解析
java·大数据·c语言·开发语言·c++
郝学胜_神的一滴4 小时前
Qt 高级开发 030:QListWidget 右键菜单全解,从策略配置到精准删除的优雅实现
c++·qt
攻城狮Soar5 小时前
STL源码解析之list(1)
开发语言·c++