vector <unique_ptr>的初始化失败,出现复制错误

时间:2017-04-09 17:40:02

标签: c++ pointers inheritance unique-ptr

我正在努力正确初始化std::vector的{​​{1}}。

示例代码:

std::unique_ptr

仅以某种方式定义#include <iostream> #include <vector> #include <memory> class Base{ public: std::string getString() { return this->string; }; protected: std::string string; }; class Derived: public Base{ public: Derived(std::string bla){ this->string = bla; } }; class Collection{ protected: std::vector<std::unique_ptr<Base>> mappings; }; class DerivedCollection: public Collection{ public: DerivedCollection(std::string bla){ std::vector<std::unique_ptr<Base>> maps; maps.push_back(std::make_unique<Derived>(bla)); //or this: (does not work aswell) //maps.emplace_back(new Derived(bla)); this->mappings = maps; } }; int main(int argc, char** argv){ DerivedCollection test = DerivedCollection("bla"); return 0; } 会触发错误:

mappings

这告诉我,我以某种方式设法从const unique_ptr构造一个unique_ptr,由于unique_ptr不是可复制构造的,所以它不起作用。

即使我对/usr/include/c++/6.3.1/bits/stl_construct.h:75:7: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = Base; _Dp = std::default_delete<Base>]’ { ::new(static_cast<void*>(__p)) _T1(std::forward<_Args>(__args)...); } 构造函数中的所有内容进行了注释,这仍然会失败。

我的猜测是我需要DerivedCollection类的正确构造函数。我不知道如何定义它。

任何想法?

- malte

1 个答案:

答案 0 :(得分:4)

maps是不可复制的,因为它是vector的{​​{1}}。将其移至unique_ptr可解决问题:

mappings

live wandbox example

您的代码也有其他问题:

  • 您应该使用成员初始化列表来初始化数据成员而不是构造函数体

  • this->mappings = std::move(maps); 可以返回getString以避免副本。

  • const std::string&的构造函数可以Derived std::move加入数据成员。

  • bla可以按如下方式初始化:test

  • 绝不应该使用
  • DerivedCollection test{"bla"} - 请改用new