我有以下......
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();
任何人都有自己的想法吗?
答案 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
答案 1 :(得分:1)
operator[]
的{{1}}要求映射类型是默认构造的(因为它首先默认构造一个新元素,然后返回对它的引用,然后你 assign < / em>到那个)。对你来说情况并非如此。您应该使用std::map
或insert
代替:
emplace
两个函数都返回有关插入是否可能的信息(密钥可能已经存在)以及具有给定密钥的元素的位置。