我正在尝试编译以下代码:
#include <boost/geometry/geometries/point_xy.hpp>
#include <iostream>
#include <utility>
typedef boost::geometry::model::d2::point_xy<long> Point;
typedef std::pair<Point, Point> Vector;
bool operator==(const Point& p1, const Point& p2) {
return p1.x() == p2.x() && p1.y() == p2.y();
}
int main() {
Vector vec1(Point(0,0), Point(1,1));
Vector vec2(Point(0,0), Point(1,2));
std::cout << ((vec1 == vec2) == false) << std::endl;
std::cout << ((vec1 == vec1) == true) << std::endl;
}
VS2012 C编译器返回以下编译错误:
... VC \ include \ utility(219):错误C2678:二进制'==':找不到哪个运算符带有'const Point'类型的左手操作数(或者没有可接受的转换)
GCC C编译器返回以下编译错误:
/ usr / include / c /4.8/bits/stl_pair.h:在实例化'bool std :: operator ==(const std :: pair <_T1,_T2>&,const std :: pair <_T1,_T2> &)[with _T1 = boost :: geometry :: model :: d2 :: point_xy; _T2 = boost :: geometry :: model :: d2 :: point_xy]':test.cpp:22:28:从这里需要/ usr / include / c /4.8/bits/stl_pair.h:215:51:错误:不匹配'operator =='(操作数类型是'const boost :: geometry :: model :: d2 :: point_xy'和'const boost :: geometry :: model :: d2 :: point_xy'){return __x . first == __y.first && __x.second == __y.second; }
如果我为Vector重载==运算符,则错误消失:
bool operator==(const Vector& v1, const Vector& v2) {
return v1.first == v2.first && v1.second == v2.second;
}
1 回答
这种失败的原因是
operator ==
forstd::pair
使用==
比较对的成员,后者又使用argument-dependent lookup (ADL)为他们找到合适的operator ==
. 但是你在错误的命名空间中提供了重载,因为Point
实际上是::boost::geometry::model::d2
中某个类型的typedef,而不是::
.如果您将运算符移动到正确的命名空间(无论如何这是一个好主意),它的工作原理如下:
Live example