使用struct插入std :: map会因构造函数错误而失败

时间:2013-12-14 16:27:37

标签: c++ map 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 个答案:

答案 0 :(得分:2)

lList[letter] = m;

这一行实际上默认构建了一个MessageLetter,然后通过引用返回它,然后为其分配m,调用operator=

这意味着MessageLetter需要一个defualt构造函数,如下所示:

MessageLetter() {}

或使用C ++ 11:

MessageLetter()=default;

如果你不打算在其中做任何事情。

您也可以在不必使用std::map::insert

进行默认构建的情况下离开
lList.insert(std::make_pair(letter), m));

或使用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

答案 1 :(得分:1)

operator[]的{​​{1}}要求映射类型是默认构造的(因为它首先默认构造一个新元素,然后返回对它的引用,然后你 assign < / em>到那个)。对你来说情况并非如此。您应该使用std::mapinsert代替:

emplace

两个函数都返回有关插入是否可能的信息(密钥可能已经存在)以及具有给定密钥的元素的位置。