2013-12-14 24 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