没有匹配函数调用‘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<const std::set<std::uint32_t>>
您发布的代码是分配对象,但也在const std::set
的实例上调用std::set::insert
,它不存在,因为std::set::insert
修改了std::set
的状态
注意编译器错误末尾的 const:‘std::set::insert(std::size_t&) const
这意味着您正在尝试调用 insert
的版本,即 const
,它不存在(也不存在)
Here you can learn more about const-qualified methods
【讨论】:
它是一个第三方库,所以我不能做任何事情,1.8 的 PCL 版本也有上面的这些语句,但它工作正常。问题出在哪里?【参考方案2】:您无法将size_t
(通常为UInt64
)类型的元素添加到set<UInt32>
,因为您无法比较UInt64
和UInt32
。
【讨论】:
【参考方案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以上是关于没有匹配函数调用‘std::set<unsigned int>::insert(std::size_t&)的主要内容,如果未能解决你的问题,请参考以下文章
调用 std::set<Type*>::find 时避免 const_cast
解析编译错误:没有匹配函数调用 'std::pair<,>::pair()'