2014-12-13 102 views
0

我想在構造函數的初始化列表中添加一個std :: map m_mapName。將std :: map添加到ctor的init列表中

如果我在構造函數的init列表中鍵入m_mapName(),編譯器會接受它。

但是,它是正確的嗎? 如果不正確,我該如何將映射添加到初始化列表中?

然後,我在地圖上做了幾次插入。什麼是插入值的更優雅的方式,所以我不會每次都調用插入函數?


更多信息:

就像在:C++, can I statically initialize a std::map at compile time?,編譯器不接受的語法,如:

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

無法使用升壓。 我的代碼看起來是這樣的:

* 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)); 
+0

你讀過關於你說的問題的答案,確切地說如何做到這一點? – 2014-12-13 00:58:21

+0

是的,我做到了。該發佈不回答我的具體問題:爲什麼編譯器接受我將映射添加到init列表的方式,以及它是否正確? – Developer 2014-12-13 01:13:46

+0

我也不能使用Boost。 – Developer 2014-12-13 01:17:53

回答

0

是的,你的代碼是正確的。並鏈接的問題顯示什麼來初始化它與

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

上面的方法給了我: 沒有匹配函數調用'std :: map ,std ::分配器 >>映射(<括號內含的初始化器列表>)' – Developer 2014-12-13 01:41:05

+0

將類型從'uint16_t'更改爲'int'。代碼如下:className :: className() :m_mapName { {0,0}} {}不幸的是,我在'{'之前'm_mapName'_和_expected構造函數,析構函數或類型轉換'{' 'token_ – Developer 2014-12-13 01:46:10

+0

我想我的代碼是這樣工作的,因爲m_mapName()調用了一些默認的構造函數。但我不確定 – Developer 2014-12-13 02:01:37