У меня есть карта с более или менее настраиваемым типом ключа (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>
)Ничего не сработало, ошибка продолжает появляться. Почему он появляется и что мне нужно изменить, чтобы он работал?
Адаптируем пример, размещенный в комментариях, так что макет 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;
Других решений пока нет …