2017-10-15 5 views
0

Hier ist der Code und die Fehlermeldung, irgendwelche Gedanken warum? Ich versuchte nach dem Entfernen dieser Codezeile Building t = beginEndMap[b.id];, kompilieren ist in Ordnung. Aber ich kann nicht das gelegentliche dieser Linie zu dem Fehler herausfinden. Diese Zeile ist nicht paarbezogen, aber der Kompilierfehler ist paarbezogen.seltsame Kompilierfehler bezüglich C++ std :: pair

Fehlermeldung,

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]' 

Quellcode,

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() { 

} 

Antwort

2

Ursache

Lange Rede kurzer Sinn, wenn Sie unordered_map::operator[] dann Building Bedürfnisse verwenden DefaultConstructible sein, die es isn t. Daher der (kritische) Fehler.

Das passiert, weil operator[] eine Einfügung durchführt, wenn der Schlüssel nicht gefunden wird.

Die Anforderungen gehen wie folgt aus:

value_type (aka std::pair<const int, Building> (meine Anmerkung)) EmplaceConstructible von

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

Wenn der Standardverteiler verwendet wird, bedeutet dies, dass key_type (int in Ihrem Fall) muss CopyConstructible und mapped_type (Building in Ihrem sein Fall) muss DefaultConstructible sein.

Die Lösung

ist ein Default-Konstruktor für Building haben oder unordered_map::at verwenden, wenn der Schlüssel nicht gefunden werfen es hat und so diese Anforderung nicht.


, warum die Compiler-Fehler im Zusammenhang anders als etwas zu paaren im Zusammenhang mit unsorted_map?

Da std::pair verwendet wird intern zu speichern, die key - value Paaren.

Ungeordnete Karte ist ein assoziativer Container, Schlüssel-Wert-Paare mit eindeutigen Schlüsseln

und da diese Art von CRIPTIC Fehlern enthalten, die Sie erhalten, wenn Sie Vorlagen haben. C++ - Konzepte sind im Gange, die genau diese Art von Fehlern (hoffentlich) drastisch verbessern werden.


std::unordered_map::operator[]

+0

Aber mein 'key_type' ist' int' andere als 'Building' finden Sie in der Definition' unordered_map beginEndMap', und meinen Sie 'value_type' andere als' key_type '? –

+1

@LinMa mein schlechtes. 'Wert_Typ'. Ich habe es korrigiert. – bolov

+0

Vielen Dank, Ihre Antwort macht Sinn für mich, aber warum der Kompilierfehler im Zusammenhang mit Paar anders als unsorted_map verwandt? –