0

このコードを実行して、コピー コンストラクターで unique_ptr を最初のベクターから別のベクターに移動しようとしました。

class Text
{
    struct paragraph
    {
        int index;
        string text;
    };

    vector<unique_ptr<paragraph>> paragraphs; 

public:

    Text()
    {
        paragraphs.push_back(unique_ptr<paragraph>(new paragraph));
    }

    Text(const Text & t)
    {
        for(int i = 0; i < (int)t.paragraphs.size(); i++)
        {
            paragraphs.push_back(move(t.paragraphs[i]));
        }
    }
};

そして、私はこのエラーを受け取りました:

1>c:\program files\microsoft visual studio 10.0\vc\include\xmemory(208): error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
1>          with
1>          [
1>              _Ty=Text::paragraph
1>          ]
// Etc.
4

2 に答える 2

5

コードにいくつか問題があります。

まず、から移動することはできません。const&これは、のメンバーにも適用されconst&ます。動きは破壊的です。からのみ移動する必要があり&&ます。コピーコンストラクタはコピーする必要があります; コピーコンストラクターが必要ない場合は、= deleteそれまたはコンパイラーが許可するものなら何でも。

次に、Test &&適切な移動コンストラクターを使用したと仮定すると、そのように各要素を移動しないでください。代わりに、次のようにベクトルを新しいベクトルに移動します。

Text(Text && t) : paragraphs(std::move(t.paragraphs)) {}

第3に、この関数は、選択したコンパイラが自動生成された移動コンストラクター(つまり、Visual Studio)をサポートしていないことを前提としてのみ作成する必要があります。それがそれをサポートしているなら、あなたはそれを全く書くべきではありません。コンパイラに任せてください。

于 2013-02-14T10:32:23.417 に答える