关于C++std::对的奇怪编译错误
Weird compile error regarding to C++ std::pair
这是代码和错误消息,有什么想法吗?我试着在删除这行代码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
在您的情况下)必须是CopyConstructible
和mapped_type
(在您的情况下为Building
)必须是DefaultConstructible
。
解决方案
是为Building
有一个默认构造函数,或者使用unordered_map::at
,如果找不到键,它将抛出,因此它没有这个要求。
为什么编译错误与配对有关,而不是与某些相关的东西有关到unsorted_map?
因为std::pair
在内部用于存储key
-value
对。
无序映射是一个包含键值的关联容器配对具有唯一密钥
,因为当你有模板时会出现这种脚本错误。C++的概念正在进行中,它将(有望)彻底改善这种错误。
std::unordereded_map::operator[]
相关文章:
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?