列表初始化 std::map 以结构体为键

List initialization of std::map with a struct as a key

提问人:James Franco 提问时间:8/20/2023 最后编辑:Jan SchultkeJames Franco 更新时间:8/20/2023 访问量:42

问:

我目前有这个:

struct Foo {
    int value = 12;
    Foo(int a) : value(a) {}
};

我正在尝试这样做:

std::map<Foo,int> m{
    {{1}, 2}
};   

为什么上面给出编译错误:

error: invalid operands to binary expression ('const Foo' and 'const Foo')
C++ 标准映射

评论


答:

2赞 Employed Russian 8/20/2023 #1

当我编译您提供的代码时,我得到一个不同的(且不言自明的)错误:g++

/usr/include/c++/12/bits/stl_function.h: In instantiation of ‘constexpr bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = Foo]’:
/usr/include/c++/12/bits/stl_function.h:408:20: error: no match for ‘operator<’ (operand types are ‘const Foo’ and ‘const Foo’)

由于您用作排序容器中的键,因此必须告诉编译器如何将两者进行比较。FooFoo

例如,添加此方法可使其编译:

bool operator<(const Foo& lhs, const Foo& rhs) {
  return lhs.value < rhs.value;
}

或者,如果您使用的是 C++20,则只需将默认的三向比较添加到 以定义所有比较运算符:struct

friend auto operator<=>(const Foo&, const Foo&) = default;