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;
}
==
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 Vector
s.
OriginalL'auteur Andrey Dyatlov | 2014-10-09
Vous devez vous connecter pour publier un commentaire.
La raison de cet échec est que le
operator ==
pourstd::pair
utilise==
de comparer les paires de membres, qui à son tour utilise argument dépendant de recherche (ADL) de trouver le bonoperator ==
pour eux. Mais vous avez fourni la surcharge dans le mal de l'espace de noms, depuisPoint
est en fait un typedef pour quelque chose dans::boost::geometry::model::d2
, et pas dans::
.Si vous déplacez l'opérateur dans l'espace de noms correct (ce qui est une bonne idée de toute façon), ça fonctionne:
Live
Candidate template ignored: could not match 'pair' against 'point_xy'
queclang
choisit de nous bénir avec? I. e. Comment cette expression nous donner que incompatibles comparaison? Pourquoi avez-ADL manquer l'une et l'autre pas (ou n'avait-il manquer ) ?non qualifiés de recherche a trouvé les
operator==
qui comporte deux paires, l'ADL n'a pas trouver d'autres surcharges. Le compilateur clang) est de vous dire: je ne peux pas l'utiliser, et je ne sais pas du tout à d'autres.Quant à la solution proposée, je n'aime pas vraiment l'idée d'ajouter du code à un espace de noms, vous n'avez pas . Plutôt que d'ajouter de l'opérateur, je voudrais essayer de trouver la solution la bibliothèque propose (je ne m'attends pas que pour être un oubli de la bibliothèque, mais intentionnellement laissée de côté pour une raison qui m'échappe). Par l'ajout de code à la bibliothèque, vous risquez de rompre avec la prochaine mise à jour (si ils ajoutent de l'opérateur dans l'avenir?) et un comportement indéfini (ce que si deux unités de traduction voir/ne pas voir l'opérateur, ou de voir les différentes versions?) Je voudrais créer une fonction nommée à la place.
Je ne savait probablement pas poser la bonne question. Je sais que l'ADL n'ai pas trouver un correspondant de l'équivalence de l'opérateur. Ce que j'essayais de demander a la pourquoi les types dans le message d'erreur ont été signalés. Ni de l'élément sur que la comparaison est un simple
point_xy
, que ce soit en appel ou dans la mise en œuvre.Je crois qu'il est en train de comparer les deux
point_xy
s à l'intérieur de la paire, mais ne trouve que leoperator==
modèle pour comparerpair
s.OriginalL'auteur Angew