2013-12-14 23 views
0

我有以下...使用結構插入到的std ::地圖失敗,構造錯誤

struct MessageLetter{ 
    char letter; 
    int count; 
    MessageLetter(char letter, int freq) 
    : letter(letter), count(freq) 
    {} 
}; 
... 
std::map<char, MessageLetter> lList; 
... 
MessageLetter m = MessageLetter(letter,1); 
lList[letter] = m; 

當我嘗試編譯我得到...

no matching constructor for initialization of 'MessageLetter' 
      ::new ((void*)__p) _Tp(); 

總得有東西容易任何人有想法?

回答

2
lList[letter] = m; 

此行實際上defaultly構建一個MessageLetter然後通過參考返回它,隨後再爲其分配米到它,調用operator=

這意味着MessageLetter需要defualt構造,像這樣:

MessageLetter() {} 

或C++ 11:

MessageLetter()=default; 

,如果你不打算在它實際做任何事情。

您也可以矇混過關,而無需使用std::map::insert

lList.insert(std::make_pair(letter), m)); 

到defaultly構建或C++ 11佈設:

lList.emplace(letter, { letter, 1 }); 

http://en.cppreference.com/w/cpp/container/map/insert

http://en.cppreference.com/w/cpp/container/map/emplace

http://en.cppreference.com/w/cpp/container/map/operator_at

+0

我不確定您的emplace示例是否正確。我會期望'list.emplace(std :: piecewise_construct,std :: forward_as_tuple(letter),std :: forward_as_tuple(letter,1));' –

1

operator[]用於std::map要求映射類型是默認constructible(因爲它首先默認構造一個新的元件,然後返回到它的基準,並且您然後分配來表示)。這不適合你。您應該使用insertemplace代替:

lList.insert(std::make_pair(letter, MessageLetter(letter, 1))); 

// or 

lList.emplace(letter, MessageLetter(letter, 1)); 

兩個函數返回有關插入是否有可能(關鍵可能已經存在),並用給定密鑰元素的位置信息。

+0

這工作太謝謝了,但我認爲下一個更詳細一點所以我接受它。 – Jackie