4

メソッドで unique_ptr のマップを設定しようとしています。

class A {
    map<int, unique_ptr<B>> x;
public:
    void setx(const map<int, unique_ptr<B>>& x) {this->x = x;} // <-- error
    ...
};

ただし、このエラーが発生しました。

'constexpr std::pair<_T1, _T2>::pair(const std::pair<_T1, _T2>&) [with _T1 = const int; _T2 = std::unique_ptr<ContextSummary>]' is implicitly deleted because the default definition would be ill-formed:

この割り当ての何が問題になっていますか?

4

1 に答える 1

6

std::unique_ptrstd::mapはコピー不可であるため、を保持する a をコピーすることはできませんunique_ptrs。あなたはそれを動かすことができます:

void setx(map<int, unique_ptr<B>> x) {
    this->x = std::move(x);
}

マップを移動するには、マップを参照にする必要がないことに注意してくださいconst。そうしないと、マップを移動できません。値で取得すると、呼び出し元は一時値または移動された左辺値を使用できます。

したがって、次のようにコードを使用します。

std::map<int, std::unique_ptr<B>> some_map = ...;
some_a.setx(std::move(some_map));

または、一時的なものを使用して、次のようにします。

some_a.setx({
    {1, make_unique<B>(...)},
    {2, make_unique<B>(...)}
});

0x499602D2 で指摘されているように、コンストラクターで直接これを行うことができます。

A::A(map<int, unique_ptr<B>> x) 
: x(std::move(x)) {

}
于 2013-06-18T14:13:06.887 に答える