我的地图中包含或多或少的自定义键类型(#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>’)|
)没有任何效果,错误不断发生。它为什么会出现,我需要做些什么才能使其正常工作?
答案 0 :(得分:4)
调整注释中发布的示例,以便模拟this.get('action')();
类在Point2f
命名空间内,与原始类一样,重现错误。
cv
按照上面的定义添加using指令没有区别,因为namespace cv
{
struct Point2f
{
int x, y;
Point2f(int v1, int v2) : x(v1), y(v2) {}
};
}
表示将using namespace cv
命名空间下的所有内容都放入当前范围,而不是后面的所有内容自动添加到cv
命名空间。
按如下方式定义cv
,以便ADL能够找到它。
operator<
为避免将操作符重载添加到其他人的命名空间,另一个选项是为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