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 ++ - 与'运算符不匹配的主要内容,如果未能解决你的问题,请参考以下文章