C ++ - 与'运算符不匹配

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C ++ - 与'运算符不匹配相关的知识,希望对你有一定的参考价值。

我有以下地图:

std::map<my_msgs::Nodelet, int> mRunningProcPID;

尝试向地图插入新对时,我收到以下错误:

error: no match for ‘operator<’ (operand types are ‘const my_msgs::Nodelet_<std::allocator<void> >’ and ‘const my_msgs::Nodelet_<std::allocator<void> >’)
       { return __x < __y; }

我知道我需要覆盖<operator for my_msgs :: Nodelet,问题是我无法访问那个h文件,因为它是由ROS自动生成的。

知道我该怎么办?

答案

知道我该怎么办?

Option 1: Use a non-member function to compare two Nodelet objects.

您可以使用以下签名在两个operator<对象之间定义非成员函数Nodelet

bool operator<(my_msgs::Nodelet const& lhs, my_msgs::Nodelet const& rhs);

您不需要修改类来执行此操作。您可以在自己的.h文件中声明它,并在您自己的.cpp文件中定义它。

Option 2: Use a functor to compare two Nodelet objects

您可以使用以下界面定义仿函数:

struct CompareNodelet
{
    bool operator()(my_msgs::Nodelet const& lhs, my_msgs::Nodelet const& rhs) const;
};

并用它来构建地图。

std::map<my_msgs::Nodelet, int, CompareNodelet> mRunningProcPID;
另一答案

问题是std::map将尝试索引映射的元素,并且它不知道如何索引my_msgs::Nodelet,因为它不知道如何比较这个对象。

在使用Compare函数声明此映射时,您必须提供第三个参数,或者为其使用默认比较方法实现必要的接口(运算符<的处理程序)。

但是你也可以通过使用std::unordered_map来避免这种麻烦。

std::unordered_map将做与std::map几乎相同的事情,但它并不打算索引元素。在许多情况下,这种方法也被认为更快。

以上是关于C ++ - 与'运算符不匹配的主要内容,如果未能解决你的问题,请参考以下文章

SQL like

为啥我从对等端接收的数据与预期输出不匹配?

Mule - 'map'运算符的类型不匹配

Valarray 切片数组与 'operator*' 不匹配

解释'空'C数组(int a = {};)

重新创建应用时,片段与底部导航视图图标不匹配