std :: map не принимает мой оператор & lt;

У меня есть карта с более или менее настраиваемым типом ключа (Point2f от OpenCV) и поэтому нужно написать свое operator<, Кроме моего operator< не принимаются

Создание карты / Доступ к элементу по ключу:

using namespace cv;
void foo()
{
map<Point2f, double> properties;

properties[Point2f(0, 0)] = 0;
}

а это мой оператор

using namespace cv;
bool operator<(Point2f lhs, Point2f rhs)
{
return lhs.x == rhs.x ? lhs.y < rhs.y : lhs.x < rhs.x;
}

но когда я пытаюсь установить значение карты, используя ключ, как указано выше, мой компилятор дает мне

/usr/include/c++/4.8/bits/stl_function.h|235|error: no match for ‘operator<’ (operand types are ‘const cv::Point_<float>’ and ‘const cv::Point_<float>’)|

(gcc, IDE Code :: Blocks)

Я уже пробовала

  • указав тип точно (cv::Point_<float>)
  • поместив оператор прямо над вызывающей его функцией
  • использование const, reference или const reference для переменных, передаваемых оператору, вместо значений

Ничего не сработало, ошибка продолжает появляться. Почему он появляется и что мне нужно изменить, чтобы он работал?

3

Решение

Адаптируем пример, размещенный в комментариях, так что макет Point2f класс находится в пределах cv Пространство имен, как и оригинал, воспроизводит ошибку.

namespace cv
{
struct Point2f
{
int x, y;
Point2f(int v1, int v2) : x(v1), y(v2) {}
};
}

Живая демо

Добавление директивы using в соответствии с приведенным выше определением не имеет значения, поскольку using namespace cv средства привести все под cv пространство имен в текущей области, не все, что следует, автоматически добавляется к cv Пространство имен.

Определите свой operator< так, чтобы ADL может найти его.

namespace cv
{
bool operator<(Point2f const& lhs, Point2f const& rhs) // pass by reference is not necessary
// but might as well
{
std::cout << "calling custom operator <\n";
return lhs.x == rhs.x ? lhs.y < rhs.y : lhs.x < rhs.x;
}
}

Живая демо


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

struct Point2fLess
{
bool operator()(Point2f const&lhs, Point2f const& rhs) const
{
std::cout << "calling custom operator <\n";
return lhs.x == rhs.x ? lhs.y < rhs.y : lhs.x < rhs.x;
}
};

Теперь определите ваш map как

std::map<Point2f, double, Point2fLess> properties;

Живая демо

4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector