c++ 如何为std::map的 Package 器实现initializer_list构造函数

6tqwzwtp  于 2023-02-26  发布在  其他
关注(0)|答案(1)|浏览(149)

这是std::map的一个简单的 Package 类。我希望能够使用初始化列表来构造Wrapper类型的对象(参见main函数),但是这个实现不起作用。

#include <map>
#include <initializer_list>

struct Key {
    Key(int k) : key(k) {}
    int key;
};

struct Value{
    Value(int v) : value(v) {}
    int value;
};

class Wrapper {
    public:
        Wrapper(std::initializer_list<std::pair<Key, Value>> initList) 
            : m_map(initList) {}

    private:
        std::map<Key, Value> m_map;
};

int main() {
    Wrapper w = {{2, 2}, {1,1}};
}

编译器给我这个错误:
error: no matching constructor for initialization of 'std::map<Key, Value>' : m_map(initList) {}
我的理解是std::intializer_list的模板参数应该是正在初始化的容器内部存储的内容。由于std::map将键-值对存储为std::pair<const key_type, value_type>,我认为这是正确的,我还尝试在m_map定义和构造函数中显式添加const(类似于std::initializer_list<std::pair<const Key, Value>>,但我仍然收到编译错误

kuuvgm7e

kuuvgm7e1#

请注意,在initializer_list:中,* 密钥 * 应为const

Wrapper(std::initializer_list<std::pair<const Key, Value>> initList)

一个std::map也需要 Key s才能与operator<进行比较。你可以把它作为一个自由函数添加进去:

bool operator<(const Key& lhs, const Key& rhs) {
    return lhs.key < rhs.key;
}

Demo
或者作为成员函数

struct Key {
    Key(int k) : key(k) {}

    bool operator<(const Key& rhs) const {
//                                 ^^^^^   <- note that it should be const
        return key < rhs.key;
    }

    int key;
};

Demo-成员函数需要为const,因为map无法在 Key 上调用非const限定的成员函数,因为 Key 一旦插入map中就不允许更改。

相关问题