11

作成中のクラスのメンバーとして、unique_ptr のベクトルが必要です。

class Foo {
    [...]

private:
    vector<unique_ptr<Bar>> barList;
}

しかし、その後、 VS2010コンパイラから不可解なエラー メッセージが表示され始めます。

error C2248: 'std::unique_ptr<_Ty>::operator =' : cannot access private member declared in class 'std::unique_ptr<_Ty>'

マイクロソフトの実装に飛び込むその下のいくつかのエラー行とともにstd::_Copy_impl<>...

メンバー宣言を次のように変更しました

vector<unique_ptr<Bar>>* barList;

そしてコンパイルします。でも、どうして本来の思い通りにできないのだろうと思わずにはいられない。笑顔のために、私はこれを試しましたが、うまくいきます:

vector<Bar> barList;

しかし、今では利便性を失っていますunique_ptr。ケーキも食べたい!

4

6 に答える 6

12

ここでの問題は、どこかでコードが の「コピー代入」演算子を呼び出そうとしていることですFoo

これにより、コンパイラは、 のすべてのサブオブジェクトのコピー代入演算子を呼び出すコピー代入演算子を生成しようとしますFoo。最終的に、これは をコピーしようとする試みにつながりますが、unique_ptrこれは不可能な操作です。

于 2012-01-24T14:27:04.980 に答える
6

unique_ptrにはコピー セマンティクスがないため、含まれているオブジェクトをコピーするメソッドは使用できません。コピーを作成しようとしている場所で使用することにより、右辺値参照でこれを行うことができます。std::moveあなたのコードを見なければ、それがどこにあるのかわかりません。

2 番目の形式でコンパイルされる場合は、同じコードを実行していないか、コンパイラのバグがあります。どちらも同じように失敗するはずです。

3番目の例では、オブジェクトが大きく、値で保存/コピーするのに費用がかかる場合を除き、値で保存するのが最も簡単な方法です。

于 2012-01-24T14:33:29.267 に答える
0

www.cplusplus.com からの抜粋

std::unique_ptr::operator=

unique_ptr 代入 オブジェクトは、格納されたポインタと格納された削除子の両方を含む x のコンテンツの所有権を取得します (ある時点でオブジェクトを削除する責任も伴います)。呼び出し前に unique_ptr オブジェクトが所有していたすべてのオブジェクトが削除されます (unique_ptr のデストラクタが呼び出されたかのように)。

しかし、警告もあります:

このページでは、C++ 標準の最新リビジョン (2011) で導入された機能について説明します。古いコンパイラではサポートされていない可能性があります。

MSVC 2010 ではoperator=、プライベート (コピー不可) として定義されていますが、swapメソッドはサポートされています。

于 2014-05-29T09:05:15.920 に答える
-3

vector の実装は、 では非公開の値代入演算子に強く依存しているため、unique_ptr を vector で使用することはできませんunique_ptrshared_ptrC++11 のブーストまたはその他のスマート ptr 実装から使用します。

于 2012-01-24T14:28:33.907 に答える