0

我正在将我的包从 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&) const' 256 | 排除标签_->插入(i);| ^~~~~~~~~~~~~~~ 在 /usr/include/c++/9/set:61 包含的文件中,

4

3 回答 3

1

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

在此处输入图像描述

类型是 typedef: 在此处输入图像描述

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

注意编译器错误末尾的 const :‘std::set::insert(std::size_t&) const 这意味着您正在尝试调用insertis的版​​本,该版本const不存在(并且不能存在)

在这里您可以了解有关 const 限定方法的更多信息

于 2021-10-26T11:38:02.973 回答
-1

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

于 2021-10-26T11:04:10.100 回答
-1

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

于 2021-10-26T11:05:19.617 回答