错误C2678:二进制'==':找不到哪个运算符采用类型的左操作数(或者没有可接受的转换)

时间:2014-10-09 08:19:42

标签: c++ templates operator-overloading boost-geometry

我正在尝试编译以下代码:

#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 /包括/ C ++ / 4.8 /比特/ stl_pair.h:

     

实例化'bool std :: operator ==(const std :: pair&lt; _T1,_T2&gt;&amp;,const std :: pair&lt; _T1,_T2&gt;&amp;)[with _T1 = boost :: geometry: :模型:: 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&amp;&amp; __x.second == __y.second; }

如果我为Vector:

重载==运算符,则错误消失
bool operator==(const Vector& v1, const Vector& v2) {
    return v1.first == v2.first && v1.second == v2.second;
}

1 个答案:

答案 0 :(得分:12)

此失败的原因是operator ==的{​​{1}}使用std::pair来比较对&#39;成员,然后使用argument-dependent lookup (ADL)为他们找到合适的==。但是您在错误的命名空间中提供了重载,因为operator ==实际上是Point中某些内容的typedef,而不是::boost::geometry::model::d2中的内容。

如果你将操作符移动到正确的命名空间(无论如何这是一个好主意),它可以工作:

::

Live example