2017-10-15 14 views
0

Voici le code et le message d'erreur, des pensées pourquoi? J'ai essayé après avoir enlevé cette ligne de code Building t = beginEndMap[b.id];, compile est ok. Mais ne peut pas comprendre l'occasionnel de cette ligne à l'erreur. Cette ligne n'est pas liée à la paire, mais l'erreur de compilation est liée à la paire.erreur de compilation bizarre concernant C++ std :: paire

Message d'erreur,

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

code source,

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

} 

Répondre

2

cause

Longue histoire courte, si vous utilisez unordered_map::operator[] puis Building a besoin d'être DefaultConstructible qui il isn 't. D'où l'erreur (criptique).

Cela se produit car operator[] effectuera une insertion si la clé n'est pas trouvée.

Les exigences vont comme ceci:

value_type (alias std::pair<const int, Building> (ma note)) doit être EmplaceConstructible de

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

Lorsque l'allocateur par défaut est utilisé, cela signifie que key_type (int dans votre cas) doit être CopyConstructible et mapped_type (Building dans votre case) doit être DefaultConstructible.

La solution

est d'avoir un constructeur par défaut pour Building ou utiliser unordered_map::at qui jetteront si la clé ne se trouve pas et il ne dispose pas à cette exigence.


pourquoi l'erreur de compilation liée à paire autre que quelque chose lié à unsorted_map?

Parce que std::pair est utilisé en interne pour stocker les key - paires value.

carte Unordered est un conteneur associatif qui contient clé-valeur paires avec des clés uniques

et parce que ce genre d'erreurs criptic que vous obtenez lorsque vous avez des modèles. Les concepts C++ sont en cours, ce qui va (espérons-le) améliorer drastiquement exactement ce genre d'erreurs.


std::unordered_map::operator[]

+0

Mais mon 'key_type' est' 'int' autre que Building', voir la définition' unordered_map beginEndMap', et voulez-vous dire '' value_type' autre que key_type '? –

+1

@LinMa mon mauvais. 'value_type'. Je l'ai corrigé. – bolov

+0

Merci, votre réponse a du sens pour moi, mais pourquoi l'erreur de compilation liée à la paire autre que quelque chose lié à unsorted_map? –