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

问题描述 投票:1回答:2

我有以下地图:

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自动生成的。

知道我该怎么办?

c++11 stl operator-overloading ros stdmap
2个回答
2
投票

知道我该怎么办?

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;

2
投票

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.