关于C++std::对的奇怪编译错误

Weird compile error regarding to C++ std::pair

本文关键字:编译 错误 C++std 关于      更新时间:2023-10-16

这是代码和错误消息,有什么想法吗?我试着在删除这行代码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,而不是。因此出现了(文字)错误。

发生这种情况是因为如果找不到密钥,operator[]将进行插入。

要求如下:

value_type(也称为std::pair<const int, Building>(我的注意事项))必须是中的EmplaceConstructible

std::piecewise_construct, std::forward_as_tuple(key), std::tuple<>()

当使用默认分配器时,这意味着key_type(int在您的情况下)必须是CopyConstructiblemapped_type(在您的情况下为Building)必须是DefaultConstructible

解决方案

是为Building有一个默认构造函数,或者使用unordered_map::at,如果找不到键,它将抛出,因此它没有这个要求。


为什么编译错误与配对有关,而不是与某些相关的东西有关到unsorted_map?

因为std::pair在内部用于存储key-value对。

无序映射是一个包含键值的关联容器配对具有唯一密钥

,因为当你有模板时会出现这种脚本错误。C++的概念正在进行中,它将(有望)彻底改善这种错误。


std::unordereded_map::operator[]