2016-12-25 7 views
0

私はクラスのメンバーとしてこのコンテナを持っている:unordered_map.emplaceコンパイラの時間エラーを教えてください?

std::unordered_map<std::string, Fruit> m_fruits; 

私は同じクラスで、それに新しい要素を追加したいが、私は2つの方法を試してみたとの両方が例に基づいて動作するはずです。 (emplaceのページに)しかしどこかで私は間違いを犯しました。 (fruitNameがのconstのstd ::文字列である&

m_fruits.emplace(fruitName, Fruit()); 

エラーC2660 'のstd ::ペア::ペア':関数は2つの引数

m_fruits.emplace(std::make_pair(fruitName, Fruit())); 
を負いません。

エラーC2440 '': '初期化子 リスト'から '_Mypair'に変換できません

フルーツクラス:

class Fruit { 

public: 
    Fruit(); 
    Fruit(const Fruit& fruit) = delete; 
    Fruit operator=(const Fruit& fruit) = delete; 
    virtual ~Fruit(); 
}; 

更新:

私は果物のデフォルトのコピーコンストラクタを削除してはいけないことが分かってきました。

しかし、私はそれを取得しません。 emplaceは、コンテナの外側にオブジェクトを作成するのではなく、コンテナにコンテナを作成するためのものですか?

は、コンテナ内のキーを持つ要素がない場合は、コンテナに新しい要素が与えられた引数でその場でを構築挿入します。

このメソッドを使用するには、なぜコピーコンストラクタが必要なのか誰かが説明してください。 ありがとう!

+0

[MCVE]を提供できますか? struct Fruit {};のような 'Fruit'のためのダミー宣言を使用してください。 '_Mypair'も疑わしいですが、標準のC++実装のようには見えません。 –

+0

'' m_fruits [fruitName] = Fruit(); '' – solti

+0

@πάνταῥεῖ - '_Mypair'は広く使われている標準ライブラリ実装のスタイルです。 –

答えて

2

これははstd ::何でペアコードは上記のコードを1として

_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX11 
    pair(const _T1& __x, const _T2& __y) 
     : first(__x), second(__y) {} 

を行い、引数はコピーから構築またはコンストラクタを移動してきています。したがってどちらか一方が必要です。

フルーツクラスには、コピーコンストラクタまたはムーブコンストラクタが定義されていません。ここでは、m_fruits.emplace(fruitName、Fruit())コンパイラは一時的なFruitオブジェクトを生成します。 Fruitクラスのコピーコンストラクタは削除されており、コンストラクタは移動していないので、コンパイラエラーが発生しています。 移動コンストラクタ

Fruit(Fruit && other) { 
} 
を紹介しますが、このエラー

1)を取り除くことができる2つの方法があります)やコピーコンストラクタに

フルーツを代わりに、コピーコンストラクタを削除定義しないでください(他のCONSTフルーツ&)ここで{}

が作動スニペット

あります
関連する問題