2016-09-04 3 views
3

私はこのMCVEを持っている:はstdするコピー可能/移動可能なオブジェクトではありません含む構造体を追加::マップ

#include <atomic> 
#include <map> 
#include <string> 

struct foo 
{ 
    int intValue; 
    std::atomic_bool bar; 

    foo(int intValue) : intValue(intValue) {}; 
}; 

std::map<std::string, foo> myMap; 

int main() 
{ 
    myMap.emplace("0", 1234); 
} 

std::atomicがコピー可能でも移動可能でもないので、それがコンパイルされません。

私の質問:

どのように私はstd::mapコンテナにコピー可能ではない/移動可能なオブジェクトを含むクラスを追加することができますか?

+0

本当に 'const char *'をマッピングのキーとして使うべきではありません。これは、それが指すものではなく、キーである*ポインタ*になるからです。 –

+0

@JoachimPileborg:これは 'MCVE 'です。実際のプロジェクトでは 'std :: string'と' foo'ははるかに複雑です。私はそれを本当に非常に小さくしたいと思っていました。 Thx –

+0

今後の参考として、MCVEを作成する際には、他の可能性のあるエラーを追加しないようにしてください。混乱するだけです。実際には*できるだけ実際のプログラムに近いMCVEを作成してください。 –

答えて

3

myMap.emplace(std::piecewise_construct, 
       std::forward_as_tuple("0"), 
       std::forward_as_tuple(1234)); 

については何?

+1

@AlBundyこのタスクの計画の一環として、 'std :: map'のドキュメントを_read_ and _studied_していると聞いたことがあります。 –

+0

@LightnessRacesinOrbit [http://en.cppreference.com/ w/cpp/container/map/emplace](http://en.cppreference.com/w/cpp/container/map/emplace)に例がありますが、これはGoogleのソート順のために最初にチェックしました - [http: /www.cplusplus.com/reference/map/map/emplace/](http://www.cplusplus.com/reference/map/map/emplace/)は** not **です。 –

+3

@LightnessRacesinOrbitこのようなコメントは必要ありません。imho –

関連する問題