2012-04-07 8 views
0

Ich habe eine Klasse mit einem std::map als Container verwendet. Ich möchte eine Funktion hinzufügen, um die Karte zwischen zwei Objekten zu kopieren. Da die Karte als privates Mitglied der Klasse deklariert wurde, benötige ich eine Friend-Funktion. Hier ist mein Code:Fehler beim Kopieren std :: map in einer Klasse

class Data; 
void copyData(Data &, Data &); 

class Data 
{ 
    private: 
    map<int, int> _data; 

    public: 
    friend void copyData(Data &, Data&); 
}; 

void copyData(Data &a, Data &b) 
{ 
    std::copy(a._data.begin(), a._data.end(), b._data.begin()); 
} 

main() 
{ 
    // initialization here 
    Data A, B; 
    copyData(A, B); 
} 

Aber es gibt viele Warnungen beim Kompilieren mit Mingw32. Wie mache ich das richtig?

+2

Gibt es einen Grund sind Sie nicht nur eine Kopie Konstruktor? Und das Übergeben von b nach Wert in copyData macht wenig Sinn. – Corbin

+0

Und wir sollten nicht raten müssen, welche Warnungen Ihr Compiler Ihnen gegeben hat. Stellen Sie sie zur Verfügung. Auch Ihr Titel sagt Warnung, Ihre Beiträge sagt Fehler. Welches ist es? –

+0

Ihre Kartendeklaration hat keinen Typ !! – IndieProgrammer

Antwort

2

Die std::map<K,V>::value_type ist definiert als std::pair<const K,V>. Dadurch wird sichergestellt, dass std::map<K,V>::iterator Objekte nicht zum Zuweisen des Schlüssels verwendet werden können (andernfalls könnten Sie die Containerinvarianten verwenden).

Das bedeutet, dass Map-Iteratoren die OutputIterator Konzeptanforderungen nicht erfüllen und Sie sie nicht als den dritten Parameter der std::copy()-Funktion verwenden können. Gleichzeitig gibt es viele Situationen, in denen dieser Code sowieso bricht, z. B. wenn eine Zuordnung mehr Zuordnungen als die andere aufweist.

Außerdem gibt es eine viel einfachere Art und Weise Ihre Funktion zu schreiben:

void copyData(Data &a, Data &b) 
{ 
    b._data = a._data; 
} 
Verwandte Themen