2012-04-07 6 views
0

私はクラスとしてstd::mapをコンテナとして使用しています。 2つのオブジェクトの間にマップをコピーする関数を追加したいと思います。マップはクラスのプライベートメンバーとして宣言されているので、私はそうするためにフレンド関数が必要です。ここに私のコードです:クラス内で定義された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に値渡しのbを渡すことはあまり意味がありません。 – Corbin

+0

コンパイラがあなたに与えた警告を推測する必要はありません。それらを提供する。また、あなたのタイトルには警告が表示され、あなたの投稿にはエラーが表示されます。どちらですか? –

+0

マップ宣言にタイプがありません! – IndieProgrammer

答えて

2

std::map<K,V>::value_typeは、std::pair<const K,V>と定義されています。これにより、std::map<K,V>::iteratorオブジェクトをキーに割り当てることができなくなります(そうでなければ、これを使用してコンテナ不変条件を破ることができます)。

これは、マップイテレータがOutputIteratorのコンセプト要件を満たしておらず、std::copy()関数の3番目のパラメータとして使用できないことを意味します。同じノートでは、あるマップに他のマップより多くの関連がある場合など、このコードが途切れてしまうような状況が数多くあります。

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