You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ROS(C++)编译报错:no matching function for call to 问题求解

问题描述

我正在基于ROS(C++)开展硕士毕业设计,开发机器人爬坡算法。执行catkin_make编译时,出现如下错误:

error: no matching function for call to ‘boost::shared_ptr<pcl::PointCloudpcl::PointXYZ >::shared_ptr(const boost::shared_ptr<const pcl::PointCloudpcl::PointXYZ >&)’
this_type(r).swap(*this);
^
/usr/include/boost/smart_ptr/shared_ptr.hpp:572:5: note: candidate: template boost::shared_ptr::shared_ptr(boost::shared_ptr&&, typename boost::detail::sp_enable_if_convertible<Y, T>::type)
shared_ptr( shared_ptr && r, typename boost::detail::sp_enable_if_convertible<Y,T>::type = boost::detail::sp_empty() )

/usr/include/boost/smart_ptr/shared_ptr.hpp:572:5: note: template argument deduction/substitution failed:
/usr/include/boost/smart_ptr/shared_ptr.hpp:511:9: note: types ‘boost::shared_ptr’ and ‘const boost::shared_ptr<const pcl::PointCloudpcl::PointXYZ >’ have incompatible cv-qualifiers
this_type(r).swap(*this);
^
/usr/include/boost/smart_ptr/shared_ptr.hpp:563:5: note: candidate: boost::shared_ptr::shared_ptr(boost::shared_ptr&&) [with T = pcl::PointCloudpcl::PointXYZ]
shared_ptr( shared_ptr && r ) BOOST_NOEXCEPT : px( r.px ), pn()

错误信息还有更多内容及另外两个错误。我怀疑是使用const指针导致的,但不确定,请问该如何解决?

解决方法

你的怀疑完全正确,这个编译错误的核心是**boost::shared_ptr<const T>与boost::shared_ptr<T>之间的类型转换不兼容**——你试图将指向const对象的shared_ptr直接赋值或构造给非const版本的shared_ptr,而Boost的shared_ptr不允许这种隐式转换(这会破坏const的只读语义)。

以下是几种可行的修复方案:

  • 创建非const副本(推荐,安全):如果确实需要修改PointCloud的数据,使用pcl::copyPointCloud生成一个非const的副本,再用副本构造非const的shared_ptr:
    // 假设已有const版本的指针
    boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZ>> const_cloud_ptr;
    // 初始化非const指针并复制数据
    boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> non_const_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);
    pcl::copyPointCloud(*const_cloud_ptr, *non_const_cloud_ptr);
    
  • 保持const一致性:如果不需要修改PointCloud数据,直接将变量类型改为boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZ>>,消除类型转换的需求。
  • 强制转换(谨慎使用):如果你能确认原始PointCloud对象本身不是const的(只是被const指针指向),可以用boost::const_pointer_cast强制转换,但这会绕过const检查,可能引发未定义行为,仅在场景完全安全时使用:
    boost::shared_ptr<const pcl::PointCloud<pcl::PointXYZ>> const_cloud_ptr;
    boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ>> non_const_cloud_ptr = boost::const_pointer_cast<pcl::PointCloud<pcl::PointXYZ>>(const_cloud_ptr);
    

另外,建议检查代码中所有涉及PointCloud shared_ptr的赋值、构造、函数传参场景,确保const修饰符的使用一致,避免跨类型的隐式转换尝试。

内容的提问来源于stack exchange,提问作者Diego

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 14:38:20