erreur C2678: binary '==' : l'opérateur n'a pas trouvé ce qui prend de la main gauche opérande de type (ou il n'est pas acceptable de conversion)

Je suis en train de compiler le code suivant:

#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 compilateur C++ renvoie l'erreur de compilation suivante:

...VC\include\utility(219): erreur C2678: binary '==' : l'opérateur n'a pas trouvé ce qui prend de la main gauche
opérande de type "const Point" (ou il n'est pas acceptable de conversion)

GCC compilateur C++ renvoie l'erreur de compilation suivante:

/usr/include/c++/4.8/bits/stl_pair.h:

Dans l'instanciation de ‘bool std::operator==(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) [avec _T1 = boost::géométrie::model::d2::point_xy; _T2 = boost::géométrie::model::d2::point_xy]’:

test.rpc:22:28: obligatoire à partir d'ici
/usr/include/c++/4.8/bits/stl_pair.h:215:51: erreur:

no match for ‘operator==’ (opérande types de ‘const boost::géométrie::model::d2::point_xy’ et ‘const boost::géométrie::model::d2::point_xy’)
{ return __x.tout d'abord == __y.premier && __x.deuxième == __y.deuxième; }

Erreur disparaît si je surcharge d'opérateur == pour les Vecteurs:

bool operator==(const Vector& v1, const Vector& v2) {
    return v1.first == v2.first && v1.second == v2.second;
}
Oui, depuis == est défini pour std::pair par la bibliothèque standard.
Si l'opérateur qui compare la Point objets avaient été trouvés par l'ADL, il n'y aurait pas besoin de fournir une operator== pour Vectors.

OriginalL'auteur Andrey Dyatlov | 2014-10-09