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
相关产品推荐
相关产品推荐

