这是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>>
,但我仍然收到编译错误
1条答案
按热度按时间kuuvgm7e1#
请注意,在
initializer_list
:中,* 密钥 * 应为const
一个
std::map
也需要 Key s才能与operator<
进行比较。你可以把它作为一个自由函数添加进去:Demo
或者作为成员函数
Demo-成员函数需要为
const
,因为map
无法在 Key 上调用非const
限定的成员函数,因为 Key 一旦插入map
中就不允许更改。