我正在努力正确初始化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
答案 0 :(得分:4)
maps
是不可复制的,因为它是vector
的{{1}}。将其移至unique_ptr
可解决问题:
mappings
您的代码也有其他问题:
您应该使用成员初始化列表来初始化数据成员而不是构造函数体。
this->mappings = std::move(maps);
可以返回getString
以避免副本。
const std::string&
的构造函数可以Derived
std::move
加入数据成员。
bla
可以按如下方式初始化:test
。
DerivedCollection test{"bla"}
- 请改用new
。