当前位置: 首页 > 知识库问答 >
问题:

错误C2678:二进制“=”:未找到接受类型为左侧操作数的运算符(或没有可接受的转换)

公孙俭
2023-03-14

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

#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\包含\实用程序(219):错误C2678:二进制 '==': 找不到运算符,该运算符采用“const Point”类型的左侧操作数(或者没有可接受的转换)

GCC C编译器返回以下编译错误:

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

在'bool std::运算符==(constd::对的html" target="_blank">实例化中

test.cpp:22: 28:需要从这里 /usr/include/c /4.8/bits/stl_pair.h: 215:51:错误:

不匹配'运算符=='(操作数类型是'常量提升::几何::模型::d2::point_xy'和'常量提升::几何::模型::d2::point_xy'){返回__x.first == __ y.first

如果我重载向量的==运算符,错误会消失:

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

共有1个答案

万俟心思
2023-03-14

失败的原因是std::对的运算符==使用==来比较对的成员,这反过来又使用参数相关查找(ADL)来为它们找到正确的运算符==。但是您在错误的命名空间中提供了重载,因为Point实际上是::boost::几何::模型::d2中的某种类型定义,而不是::

如果将操作符移动到正确的命名空间中(无论如何这是个好主意),它会起作用:

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

现场示例

 类似资料: