C ++ - нет совпадения для оператора < - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть следующая карта:

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; }

Я понял, что мне нужно переопределить оператор <для my_msgs :: Nodelet, проблема в том, что у меня нет доступа к этому h-файлу, так как он автоматически генерируется ROS. </p>

Есть идеи, что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Есть идеи, что я могу сделать?

Вариант 1. Использование функции, не являющейся членом, для сравнения двух Nodelet объектов.

Вы можете определить функцию, не являющуюся членом operator<, между двумя Nodelet объектами со следующей подписью.

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

Вам не нужна способность изменять класс, чтобы сделать это. Вы можете объявить его в своем собственном файле .h и определить его в своем собственном файле .cpp.

Вариант 2. Использование функтора для сравнения двух Nodelet объектов

Вы можете определить функтор со следующим интерфейсом:

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

и используйте его для построения карты.

std::map<my_msgs::Nodelet, int, CompareNodelet> mRunningProcPID;
0 голосов
/ 05 ноября 2018

Проблема в том, что std::map попытается проиндексировать сопоставленные элементы, и он не знает, как индексировать my_msgs::Nodelet, потому что не знает, как сравнить этот объект.

Необходимо указать третий параметр при объявлении этой карты с помощью функции сравнения или реализовать необходимый интерфейс (обработчик для оператора <), чтобы он использовал метод сравнения по умолчанию.

Но вы также можете избежать этой проблемы, просто взамен std::unordered_map.

std::unordered_map будет делать то же самое, что и std::map, но не будет индексировать элементы. Этот подход также считается более быстрым во многих случаях.

...