这是代码和错误消息,任何想法为什么?我尝试删除这行代码Building t = beginEndMap[b.id];
后,编译就可以了。但无法弄清楚这条线的偶然错误。此行与对不相关,但编译错误与对有关。
错误信息,
Error:
required from 'std::pair<_T1, _T2>::pair(std::piecewise_construct_t, std::tuple<_Args1 ...>, std::tuple<_Args2 ...>) [with _Args1 = {const int&}; _Args2 = {}; _T1 = const int; _T2 = Building]'
源代码,
struct Building {
int id;
int pos;
int height;
bool isStart;
Building(int i, int p, int h, int s) {
id = i;
pos = p;
height = h;
isStart = s;
}
};
class Solution {
public:
vector<pair<int, int>> getSkyline(vector<vector<int>>& buildings) {
vector<Building> sortedBuilding;
unordered_map<int, Building> beginEndMap;
vector<pair<int, int>> result;
for (Building b : sortedBuilding) {
Building t = beginEndMap[b.id];
}
return result;
}
};
int main() {
}
长话短说,如果你使用unordered_map::operator[]
然后Building
需要是DefaultConstructible
,它不是。因此(criptic)错误。
发生这种情况是因为如果找不到密钥,operator[]
会进行插入。
要求是这样的:
value_type
(a.k.astd::pair<const int, Building>
(我的笔记))必须是EmplaceConstructible
来自std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>()
当使用默认分配器时,这意味着
key_type
(在你的情况下是int
)必须是CopyConstructible
和mapped_type
(在你的情况下是Building
)必须是DefaultConstructible
。
是有一个Building
的默认构造函数,或者使用unordered_map::at
,如果找不到密钥将抛出,因此它没有此要求。
为什么编译错误与对与unsorted_map相关的东西有关?
因为std::pair
在内部用于存储key
-value
对。
Unordered_map是一个关联容器,包含具有唯一键的键值对
并且因为当你有模板时会得到这些神秘的错误。 C ++概念正在进行中,它(希望)将彻底改善这种错误。