C++结构体作为map键值时operator<重载报错的解决咨询
解决std::map/std::set中自定义坐标结构体的运算符错误问题
这个错误的根源其实很简单:std::map在内部处理键的时候,会把键当作const对象来使用,但你的比较运算符成员函数没有声明为const。
编译器报错里提到的“left-hand operand of type 'const _Ty'”,就是指std::map试图用const Coord_T对象调用你的operator<,但你的函数没有const限定符,无法作用于const对象,所以编译器找不到匹配的运算符。
修复方法
只需要把所有比较运算符都声明为const成员函数就行了——尤其是operator<,因为std::map只依赖这个运算符来维护内部的有序结构(其他运算符其实不是std::map必需的,不过为了结构体的完整性加上const也更规范)。
修改后的代码如下:
struct Coord_T { uint64_t x, y; inline bool operator==(const Coord_T& o) const { return x == o.x && y == o.y; } inline bool operator<(const Coord_T& o) const { return x < o.x || (x == o.x && y < o.y); } inline bool operator>(const Coord_T& o) const { return x > o.x || (x == o.x && y > o.y); } inline bool operator!=(const Coord_T& o) const { return x != o.x || y != o.y; } inline bool operator<=(const Coord_T& o) const { return x < o.x || (x == o.x && y <= o.y); } inline bool operator>=(const Coord_T& o) const { return x > o.x || (x == o.x && y >= o.y); } }; int main() { Coord_T coord; coord.x = 5; coord.y = 6; std::map<Coord_T, bool> vals; vals[coord] = true; return 0; }
另一种可选方案
如果你不想修改结构体的成员函数,也可以自定义一个外部比较器,然后在声明std::map时指定它:
struct CoordCompare { bool operator()(const Coord_T& a, const Coord_T& b) const { return a.x < b.x || (a.x == b.x && a.y < b.y); } }; // 声明map时指定比较器 std::map<Coord_T, bool, CoordCompare> vals;
不过第一种直接给成员函数加const的方式更简洁,也符合C++的常规写法。
内容的提问来源于stack exchange,提问作者leaf26
相关产品推荐
相关产品推荐

