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

问题描述 投票:0回答:1

这是代码和错误消息,任何想法为什么?我尝试删除这行代码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() {

}
c++ stl
1个回答
2
投票

Cause

长话短说,如果你使用unordered_map::operator[]然后Building需要是DefaultConstructible,它不是。因此(criptic)错误。

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

要求是这样的:

value_type(a.k.a std::pair<const int, Building>(我的笔记))必须是EmplaceConstructible来自

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

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

The Solution

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


为什么编译错误与对与unsorted_map相关的东西有关?

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

Unordered_map是一个关联容器,包含具有唯一键的键值对

并且因为当你有模板时会得到这些神秘的错误。 C ++概念正在进行中,它(希望)将彻底改善这种错误。


std::unordered_map::operator[]

© www.soinside.com 2019 - 2024. All rights reserved.