std :: map不接受我的运算符<

时间:2016-01-11 17:40:49

标签: c++ opencv c++11

我的地图中包含或多或少的自定义键类型(#down来自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;
}

(gcc,IDE Code :: Blocks)

我已经尝试了

  • 完全指定类型(/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>’)|
  • 将操作员直接放在调用它的函数上面
  • 对传递给运算符的变量使用const,reference或const引用而不是值

没有任何效果,错误不断发生。它为什么会出现,我需要做些什么才能使其正常工作?

1 个答案:

答案 0 :(得分:4)

调整注释中发布的示例,以便模拟this.get('action')(); 类在Point2f命名空间内,与原始类一样,重现错误。

cv

Live demo

按照上面的定义添加using指令没有区别,因为namespace cv { struct Point2f { int x, y; Point2f(int v1, int v2) : x(v1), y(v2) {} }; } 表示using namespace cv命名空间下的所有内容都放入当前范围,而不是后面的所有内容自动添加到cv命名空间

按如下方式定义cv,以便ADL能够找到它。

operator<

Live demo

为避免将操作符重载添加到其他人的命名空间,另一个选项是为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

Live demo