2012-04-07 30 views
0

我有一個std::map用作容器的類。我想添加一個函數來在兩個對象之間複製地圖。由於地圖被宣佈爲類的私人成員,因此我需要一個朋友函數來執行此操作。這裏是我的代碼:錯誤,同時複製在類中定義的std :: map

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); 
} 

但是在使用mingw32編譯時有很多警告。我如何正確地做到這一點?

+2

有沒有你不只是使用拷貝構造函數的一個原因?並且,將值傳遞給copyData沒有多大意義。 – Corbin 2012-04-07 04:29:59

+0

我們不應該猜測編譯器給你的警告。提供它們。此外,你的標題說警告,你的帖子說錯誤。這是什麼? – 2012-04-07 04:43:16

+0

您的地圖聲明沒有類型! – IndieProgrammer 2012-04-07 04:56:22

回答

2

std::map<K,V>::value_type定義爲std::pair<const K,V>。這確保std::map<K,V>::iterator對象不能用於分配鍵(否則您可以使用它來打破容器不變量)。

這意味着映射迭代器不符合OutputIterator的概念要求,並且不能將它們用作std::copy()函數的第三個參數。在同樣的說明中,有很多情況會導致代碼中斷,比如一個地圖比另一個地圖有更多的關聯。

此外,還有寫你的功能更簡單的方法:

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