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

ROS Melodic迁移Noetic调用PCL setExcludeLabels出现std::set insert编译错误

问题根因

该编译错误是ROS Noetic配套的PCL 1.10版本的已知代码缺陷,结合Ubuntu 20.04默认GCC 9编译器更严格的语法检查规则触发:

  • EuclideanClusterComparator类的成员变量exclude_labels_被定义为boost::shared_ptr<const std::set<std::uint32_t>>类型,指向的集合本身不可修改,但setExcludeLabels接口的实现逻辑先给exclude_labels_赋值,再尝试调用insert方法修改集合,触发const方法匹配错误
  • 循环变量i的类型为std::size_t,64位系统下为64位无符号整型,和集合元素类型std::uint32_t(32位无符号整型)不匹配,进一步加重了类型匹配异常
修复方案

方案1:修改本地业务代码绕开(无需修改PCL源码,优先推荐)

EuclideanClusterComparator提供了接受boost::shared_ptr<const std::set<std::uint32_t>>参数的setExcludeLabels重载接口,直接构造好过滤后的标签集合传入即可,替换原有调用代码示例:

std::vector<bool> ignore_labels;
ignore_labels.resize(2);
ignore_labels[0] = true;
ignore_labels[1] = false;

// 替换原有ecc->setExcludeLabels(ignore_labels);调用
auto exclude_labels = boost::make_shared<std::set<std::uint32_t>>();
for (std::uint32_t i = 0; i < ignore_labels.size(); ++i) {
    if (ignore_labels[i]) {
        exclude_labels->insert(i);
    }
}
ecc->setExcludeLabels(exclude_labels);

方案2:修改PCL头文件修复(适合多工程共用该接口的场景)

编辑路径/usr/include/pcl-1.10/pcl/segmentation/euclidean_cluster_comparator.h中的setExcludeLabels实现,调整逻辑先构造完整集合再赋值给const成员:

void
setExcludeLabels (const std::vector<bool>& exclude_labels)
{
  // 先构造临时非const集合完成数据写入
  auto tmp = boost::make_shared<std::set<std::uint32_t> > ();
  for (std::uint32_t i = 0; i < exclude_labels.size (); ++i)
    if (exclude_labels[i])
      tmp->insert (i);
  // 再赋值给const类型的成员变量
  exclude_labels_ = tmp;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:45:04