没有匹配函数来调用‘std::set<unsigned int>::insert(std::size_t&)

no matching function for call to ‘std::set<unsigned int>::insert(std::size_t&)

我正在努力将我的包从 ros melodic 迁移到 ros noetic。在执行此操作时,我在 cmake 期间在 PCL 库中遇到了编译错误。包太大了,我在发生错误的地方给出了一些代码。任何指导都会有所帮助。 这是myfile.cpp

std::vector<bool> ignore_labels;

ignore_labels.resize(2);
ignore_labels[0] = true;
ignore_labels[1] = false;

//TODO commented that out i think we have to fix the error
ecc->setExcludeLabels(ignore_labels);

'''

这是它在行 ecc->setExcludeLabels(ignore_labels); 处调用的 PCL-1.10 库文件,此处发生错误,

''' brief 在要排除的标签云中设置标签。 param[in] exclude_labels 对应于是否应考虑给定标签的布尔值向量

  void
  setExcludeLabels (const std::vector<bool>& exclude_labels)
  {
    exclude_labels_ = boost::make_shared<std::set<std::uint32_t> > ();
    for (std::size_t i = 0; i < exclude_labels.size (); ++i)
      if (exclude_labels[i])
        exclude_labels_->insert (i);
  }

'''

错误是

/usr/include/pcl-1.10/pcl/segmentation/euclidean_cluster_comparator.h:256:13: 错误:没有匹配函数来调用 'std::set::insert(std:: size_t&) 常量' 256 | exclude_labels_->插入(i); | ^~~~~~~~~~~~~~~ 在 /usr/include/c++/9/set:61,

包含的文件中

您不能将类型为 size_t(通常为 UInt64)的元素添加到 set<UInt32>,因为您无法比较 UInt64UInt32

错误发生是因为 size_t 的变量试图插入到容器 exclude_labels_ 中。请将变量 i 转换为 uint32_t 然后尝试插入容器 exclude_labels_.

我已经查看了这个库的源代码,这里是问题所在:

类型是 typedef:

问题是对象本身是 shared_ptr<const std::set<std::uint32_t>> 您发布的代码正在分配对象,但也在 const std::set 的实例上调用 std::set::insert,该实例不存在,因为 std::set::insert 修改了 std::set[ 的状态=21=]

注意编译器错误末尾的常量:‘std::set::insert(std::size_t&) const 这意味着您正在尝试调用 insertconst 版本,它不存在(也不可能存在)

Here you can learn more about const-qualified methods