2017-07-23 1 views
0

Zuordnung Dies ist Auszug aus meinem Code:Fehler beim einem Paar Wert auf einen Mapkey

std::map<int, std::pair< const int, const std::vector<POINT_3d> > > m_srcHitData; 
void addHit(const int edgeId, const int hit) 
{ 
    m_srcHitData[edgeId] = std::make_pair(hit, std::vector<POINT_3d>()); 
} 

Ich erhalte die Fehlermeldung:

stl_pair.h(180): error: no operator "=" matches these operands 
       operand types are: const std::vector<POINT_3d, std::allocator<POINT_3d>> = const std::vector<POINT_3d, std::allocator<POINT_3d>> 
       second = __p.second; 
        ^
    detected during instantiation of "std::pair<_T1, _T2> &std::pair<_T1, _T2>::operator=(const std::pair<_U1, _U2> &) 

Was bedeutet das? Ich habe verschiedene Ansätze versucht, aber immer noch diesen oder ähnliche Fehler. Vielen Dank!

+2

Anstelle der Verwendung von 'm_srcHitData [edgeId] = std :: make_pair (hit, std :: vector ()); 'versuchen Sie es mit' m_srcHitData [edgeId] .insert (std :: make_pair (hit, std :: vector ()); 'und sehen, ob dies funktioniert oder Ihnen eine anderer Compilerfehler.Hmm, jetzt, da ich über diesen Einschub dachte, kann nicht an 'm_srcHitDat [idx]' dasselbe Problem wie einpoklum, das wegen constness angegeben wird, arbeiten. –

+1

@Francis Sie meinten eigentlich nicht m_srcHitData [edgeId] .insert(), oder? Es sollte m_srcHitData.insert (pair (edgeId, ...)) sein. Das funktioniert, danke! –

+0

und als ich antwortete, hatte ich meine IDE nicht geöffnet. Also versuchte ich, das Gedächtnis zu verlieren ... beziehe mich auf meine Antwort als den richtigen Weg, um die Karte zu erstellen. –

Antwort

2

Nun, m_srcHitData[edgeId] ist ein Paar mit einem const Vektorelement. Sie können einfach nicht zuordnen, weil das bedeutet, zu dem const Vektor zuweisen, was nicht möglich ist ...

Als für das, was Sie dagegen tun können, finden Sie unter:

How to create a std::map of constant values which is still accessible by the [] operator?

Wie @FrancisCugler schon sagt, das könnte zum Beispiel Schreiben:

m_srcHitData[edgeId].insert(std::make_pair(hit, std::vector<POINT_3d>()); 

Allerdings, wenn Ihre Vektoren lang sind, können Sie nicht wirklich wollen, um all diese Daten zu kopieren.

+0

@ M.M: Du hast Recht. – einpoklum

1

Dieser Teil im Code Art von hässlich aussieht ...

std::map<int, std::pair< const int, const std::vector<POINT_3d> > > m_srcHitData; 

Sie könnten versuchen, Ihren Code Umstrukturierung ein wenig.

struct Pair { 
    unsigned int key_; 
    std::vector<POINT_3d> points_; 

    Pair() {} // Empty Default 
    Pair(const unsigned int& key, const std::vector<POINT_3d>& points) : 
     key_(key), 
     points_(points) 
    {} 
}; 

Then ...

std::map<unsigned, Pair> m_srcHitData; 

void addHit(const int edgeId, const int hit) { 
    m_srcHitData[edgeId] = Pair(hit, std::vector<POINT_3d>()); 
} 

Ich habe dieses kurzes Programm eine ähnliche Struktur zu simulieren, nur habe ich strings anstelle Ihrem std::vector<POINT_3d>

#include <string> 
#include <iostream> 
#include <map> 

struct Pair { 
    unsigned key_; 
    std::string value_; 

    Pair() {} 
    Pair(const unsigned int& key, const std::string& value) : 
     key_(key), 
     value_(value) {} 
}; 

class MyClass { 
public: 
    std::map<unsigned, Pair> myMap_; 

    void addValue(const unsigned int& key, const std::string& value) { 
     myMap_[key] = Pair(key, value); 
    } 
}; 

int main() { 

    MyClass myClass; 
    myClass.addValue(1, "Hello"); 
    myClass.addValue(2, "World"); 

    typedef std::map<unsigned, Pair>::iterator Iter; 
    Iter it = myClass.myMap_.begin(); 

    for (; it != myClass.myMap_.end(); ++it) { 
     std::cout << "Key: " << it->first << " Pair-Key: " << it->second.key_ << " Pair-value: " << it->second.value_ << std::endl; 
    } 


    std::cout << "\nPress any key and enter to quit." << std::endl; 
    char c; 
    std::cin >> c; 
} 

Sie die oben verwenden können, außer ersetzen Sie Ihre Objekte von vector<T> durch die strings.

Ich verwendete auch öffentliche Schnittstelle auf beiden struct und class für die Einfachheit der Demonstration. Normalerweise wäre der Container in der class entweder protected oder private mit Zubehörfunktionen.

BEARBEITEN Dies hilft beim Erstellen der Karte zuerst. Sobald die Karte funktioniert, können Sie sie ändern, um sie bei Bedarf in die Speicherbereiche const einzufügen. Es kann jedoch schwierig sein, mit ihnen zu arbeiten. Siehe den Link in einpoklums Antwort.

Wenn Sie mit den neueren Versionen von C arbeiten ++ können Sie diese Zeilen Code ändern:

typedef std::map<unsigned, Pair>::iterator Iter; 
Iter it = myClass.myMap_.begin(); 

in diese:

auto it = myClass.myMap_.begin(); 
Verwandte Themen