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

Posted

技术标签:

【中文标题】没有匹配函数调用‘std::set<unsigned int>::insert(std::size_t&)【英文标题】:no matching function for call to ‘std::set<unsigned int>::insert(std::size_t&) 【发布时间】:2021-10-26 10:52:04 【问题描述】:

我正在将我的包从 ros melodic 迁移到 ros noetic。在执行此操作时,我在 cmake 期间在 PCL 库中出现编译错误。包太大了,我给出了一些发生错误的代码。任何指导都会有所帮助。 这是我的文件.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 库文件,发生了错误,

''' 在标签云中设置要排除的标签。 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 包含的文件中,

【问题讨论】:

exclude_labels_的类型是什么? exclude_labels_ 的类型为 std::set<:uint32_t> 【参考方案1】:

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

类型是 typedef:

问题是对象本身是shared_ptr&lt;const std::set&lt;std::uint32_t&gt;&gt; 您发布的代码是分配对象,但也在const std::set 的实例上调用std::set::insert,它不存在,因为std::set::insert 修改了std::set 的状态

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

Here you can learn more about const-qualified methods

【讨论】:

它是一个第三方库,所以我不能做任何事情,1.8 的 PCL 版本也有上面的这些语句,但它工作正常。问题出在哪里?【参考方案2】:

您无法将size_t(通常为UInt64)类型的元素添加到set&lt;UInt32&gt;,因为您无法比较UInt64UInt32

【讨论】:

【参考方案3】:

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

【讨论】:

感谢您的回答,但正如您所说的 PCL1-10 库的 exclude_labels_ 代码中的错误应该不会错,对吧?我会尝试投射并询问它是否有效 静态转换后错误仍然存​​在。 /usr/include/pcl-1.10/pcl/segmentation/euclidean_cluster_comparator.h:256:13:错误:没有匹配函数调用'std::set::insert(pcl::uint32_t)常量' 256 | exclude_labels_->insert (static_cast(i)); size_t 最终可能是 64 位,当然,但这不是编译器错误,它最多只会损失精度,因为它会隐式向下转换为 32 位 但是没有链接,cmake没有编译?

以上是关于没有匹配函数调用‘std::set<unsigned int>::insert(std::size_t&)的主要内容,如果未能解决你的问题,请参考以下文章

调用 std::set<Type*>::find 时避免 const_cast

虚拟继承:没有匹配的调用函数

调用Dice :: Dice(类构造函数)没有匹配函数

解析编译错误:没有匹配函数调用 'std::pair<,>::pair()'

std::set 作为类成员不能使用函数指针作为 key_comp

错误:没有匹配函数调用‘std::vector<std: