以结构体为键初始化std::map时编译报错原因咨询
编译错误原因分析
你的代码定义
Foo结构体:
struct Foo { int value = 12; Foo(int a) : value(a) {} };
map初始化代码:
std::map<Foo,int> m{ {{1}, 2} };
错误原因
std::map是有序关联容器,默认要求它的键类型必须支持小于比较操作(const修饰的operator<)——因为map需要通过比较键的大小来维护内部元素的有序排列,插入、查找等核心操作都会依赖这个逻辑。
你定义的Foo结构体没有重载接收const Foo&参数的operator<,也没有在声明std::map时指定自定义的比较器。当编译器尝试在插入元素时比较两个const Foo对象,找不到合法的二元比较运算符,就会抛出error: invalid operands to binary expression ('const Foo' and 'const Foo')这个错误。
解决方法
方法1:给Foo重载operator<
直接在Foo结构体中添加小于运算符的重载,注意必须是const成员函数:
struct Foo { int value = 12; Foo(int a) : value(a) {} bool operator<(const Foo& other) const { return value < other.value; } };
方法2:指定自定义比较器
如果不想修改Foo结构体,可以给map传入自定义的比较器类型:
// 定义比较器 struct FooCompare { bool operator()(const Foo& lhs, const Foo& rhs) const { return lhs.value < rhs.value; } }; // 使用自定义比较器声明map std::map<Foo, int, FooCompare> m{ {{1}, 2} };
内容的提问来源于stack exchange,提问作者James Franco
相关产品推荐
相关产品推荐

