初始化一个以shared_ptr为值的const映射
Initialize a const map which has shared_ptr as values
我正在尝试创建一个const映射,其中键为int,第二个值为类的shared_ptr。
比方说,我有一个类a,B,C从a派生。我想能够创建一个地图
const map<int, shared_ptr<A>> mymap
并使用以下值初始化映射:
{1, new B()} and {2, new C()}
但使用初始值设定项列表会产生错误。我该怎么做有什么帮助吗?
问题是您试图从原始指针隐式构造shared_ptr
。你必须这样初始化你的地图:
const map<int, shared_ptr<A>> mymap = {
{1, shared_ptr<B>(new B())},
{2, shared_ptr<C>(new C())}
};
C++11标准第20.7.2.2段要求接受原始指针为explicit
:的shared_ptr<>
的构造函数
template<typename Y> explicit shared_ptr(Y* p);
问题是,您试图通过将原始指针作为第二个参数传递给接受shared_ptr<A>
的pair<>
的构造函数来构造std::pair<int, shared_ptr<A>>
的实例。基本上,这与相同
pair<int, shared_ptr<A>> mymap(1, new B()); // ERROR!
pair<int, shared_ptr<A>> mymap(1, shared_ptr<B>(new B())); // OK
也就是说,除非你有充分的理由这样做,并且你真的知道自己在做什么,否则最好使用std::make_shared<>()
来创建共享指针,这既是因为效率(它执行一个内存分配,而不是两个),也是因为异常安全(如果B
或C
的构造函数抛出异常,它不会泄漏)。因此,您的地图初始化应该看起来像:
const map<int, shared_ptr<A>> mymap = {
{1, make_shared<B>()},
{2, make_shared<C>()}
};
相关文章:
- 使用 const char* 键映射 C++ 检索空值
- 使用 const char* 作为映射/unordered_map的键
- 将引用对具有shared_ptr作为值的映射转换为对具有shared_ptr const 作为值的映射的引用
- 作为映射键的对象在CPP中变为const
- 从 Java 调用C++函数。映射"const char*"
- 哈希映射错误:与调用 '(const __gnu_cxx::.
- C++ - 映射 - 错误:请求"w"中的成员'first',该成员属于非类类型 'const int'
- 如何将const std::shared_ptr插入到std::映射中
- 使用JNA将const char**映射到Java类型
- 如何在const方法中迭代映射
- 如何将const_cast的const指针向量映射到非常量指针向量
- 在STXXL映射中使用const char*
- C++从const函数调用指向具有映射的成员的指针
- Pair(const std::p air<_T1, _T2>&) 被隐式删除,因为默认定义格式不正确 错误:分配unique_ptr映射时
- c++模板类静态const变量成员作为映射键给出未定义引用
- c++中使用const char*作为映射键的正确方法
- 在const函数中更改映射内容
- C++ 映射/设置迭代器不可取消引用 --- map<const char *,字符串>
- 可以将非const值类型的映射强制转换为const值类型的映射吗?
- 初始化一个以shared_ptr为值的const映射