Foo
私はを含むという名前の構造を持っていますunique_ptr
struct Foo {
std::unique_ptr<Bar> pointer;
};
今、私はのインスタンスを保存しようとしてFoo
いますunordered_map
std::unordered_map<int,Foo> myMap;
マップはコピーコンストラクターを必要とせず、移動コンストラクターのみを必要とするため、技術的にはこれが可能であるはずです。
ただし、マップに要素を挿入できません。
myMap.insert(std::make_pair(3, Foo()));
この行は、Visual C ++ 2010で次のエラーを生成します(私のコンパイラは英語ではないため、私が大まかに翻訳しました)。
error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : unable to access private member declared in 'std::unique_ptr<_Ty>'
with
[
_Ty=Foo
]
c:\Softwares\Visual Studio 10.0\VC\include\memory(2347) : see declaration of 'std::unique_ptr<_Ty>::unique_ptr'
with
[
_Ty=Foo
]
This diagnostic happened in the compiler-generated function 'Foo::Foo(const Foo&)'
そのため、不明な理由で、コンパイラーはFoo
移動コンストラクターの代わりにコピーコンストラクターを生成しようとして失敗します。
に置き換えstd::make_pair
てみましstd::pair<int,something>
たが、うまくいくものが見つかりませんsomething
。
編集:これは動作します
struct Foo {
Foo() {}
Foo(Foo&& other) : pointer(std::move(other.pointer)) {}
std::unique_ptr<Bar> pointer;
};
しかし、私の実際の構造には多くのメンバーが含まれているため、moveコンストラクターでそれらすべてを記述したくありません。