web-dev-qa-db-ja.com

エラーC2678:バイナリ '==':タイプの左側のオペランドをとる演算子が見つかりません(または許容できる変換がありません)

次のコードをコンパイルしようとしています。

#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。最初== __y.first && __x.second == __y.second; }

Vectorの==演算子をオーバーロードするとエラーが消えます。

bool operator==(const Vector& v1, const Vector& v2) {
    return v1.first == v2.first && v1.second == v2.second;
}
10
Andrey Dyatlov

これが失敗する理由は、operator ==std::pair==を使用してペアのメンバーを比較し、次に 引数依存ルックアップ(ADL) を使用するためです。適切なoperator ==を見つけるために。しかし、Pointは実際には::boost::geometry::model::d2ではなく::内の何かのtypedefであるため、誤った名前空間でオーバーロードを提供しました。

オペレーターを正しいネームスペースに移動すると(とにかく良い考えです)、機能します。

#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;

namespace boost { namespace geometry { namespace model { namespace d2 {

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;
}

実例

12
Angew