2

私は解決策を何時間も探し、unique_ptrコピーなし/割り当てなしに関連するコンパイルエラーに対処するためにさまざまな方法を試しました。私は隠しコピーを書き、ベクターがそれを無駄に呼び出さないように割り当てました。

コンパイルエラーの原因となるコードは次のとおりです。

class World{
    World(const World&) {}
    World& operator=(const World&) {return *this; }

    std::vector<std::vector<std::unique_ptr<Organism>>> cell_grid;
public:
    World() {
        cell_grid = std::vector<std::vector<std::unique_ptr<Organism>>> (20, std::vector<std::unique_ptr<Organism>> (20, nullptr));
    }
    ~World() {}
};

コンパイルエラーは、プライベートメンバーのアクセスの問題に関連しています。

4

1 に答える 1

3

問題は、このvectorコンストラクターの使用です。

vector(size_type n, const T& value);

このコンストラクターはvector長さのを作成しn、各n要素にはのコピーがありvalueます。unique_ptrコピーできない(また、コピーできない)ためvector<unique_ptr>、このコンストラクターを使用することはできません。代わりにこれを行います:

World()
    : cell_grid(20)
{
    for (auto& row : cell_grid)
        row.resize(20);
}

最初の行は、のデフォルトコンストラクターを呼び出し、vector<unique_ptr>20サイズ0を作成しますvector<unique_ptr>

次に、ループはそれらvector<unique_ptr>のそれぞれのサイズをサイズ== 20に変更し、各要素はデフォルトで作成されますunique_ptr(値はnullptr)。

于 2013-01-27T15:39:18.867 に答える