【问题标题】:adding std::map to init list of ctor将 std::map 添加到 ctor 的初始化列表
【发布时间】:2015-02-11 19:00:51
【问题描述】:

我想在构造函数的初始化列表中添加一个 std::map m_mapName。

如果我在构造函数的初始化列表中键入 m_mapName(),编译器会接受它。

但是,它是正确的吗? 如果不正确,如何将地图添加到初始化列表中?

然后,我在地图中进行了几次插入。有什么更优雅的插入值的方式,所以我不会每次都调用插入函数?


更多信息:

就像在:C++, can I statically initialize a std::map at compile time? 中一样,编译器不接受如下语法:

std::map<int, char> example = { (1,'a'),
                            (2, 'b'),
                            (3, 'c') };

无法使用 Boost。 我的代码如下所示:

* className.h: *

typedef std::map <uint16_t, int> mapType;

typedef std::pair <uint16_t, int> mapPair;

className{

private: 

    mapType m_mapName; 

}

* className.cpp: *

className::className () : 

m_mapName()

{

...

m_mapName.insert(mapPair(someMapValue1, 0));

m_mapName.insert(mapPair(someMapValue2, 0));

m_mapName.insert(mapPair(someMapValue3, 0));

【问题讨论】:

  • 您是否阅读了与您链接的问题的答案,确切地说出了如何做到这一点?
  • 是的,我做到了。该帖子没有回答我的具体问题:为什么编译器接受我将地图添加到初始化列表的方式以及它是否正确?
  • 我也无法使用 Boost。
  • 这不是您的代码的样子,您缺少class 和至少一个分号。 stackoverflow.com/help/mcve

标签: list map init


【解决方案1】:

是的,您的代码是正确的。链接的问题显示了用什么来初始化它

className::className () 
:m_mapName{ 
    {someMapValue1, 0}, 
    {someMapValue2, 0}, 
    {someMapValue3, 0}}
{}

【讨论】:

  • 上面的方法给了我:没有匹配函数调用 'std::map, std::allocator<: pair short unsigned int> >>::map()'
  • 将类型从“uint16_t”更改为“int”。代码如下所示: className::className () :m_mapName{ {0, 0}} {} 不幸的是,我得到 expected '{' before 'm_mapName'expected constructor, destructor,或在'{'令牌之前进行类型转换
  • 我猜我的代码是这样工作的,因为 m_mapName() 以某种方式调用了一些默认构造函数。但我不确定
  • 另外,我无法重现您的问题:coliru.stacked-crooked.com/a/2cccca1a328c81c7
猜你喜欢
  • 1970-01-01
  • 2017-05-02
  • 2016-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
相关资源
最近更新 更多