c – 初始化一个const映射,其中shared_ptr为值

c – 初始化一个const映射,其中shared_ptr为值,第1张

概述我试图创建一个const映射,键为int,第二个值是shared_ptr到类. 比方说,我有一个带有B的A类,而来自A的C. 我希望能够创建一个地图 const map<int, shared_ptr<A>> mymap 并使用值初始化地图: {1, new B()} and {2, new C()} 但使用初始化列表会出错. 有什么帮助我怎么能这样做? 问题是您正在尝试从原始指针隐式构造shar 我试图创建一个const映射,键为int,第二个值是shared_ptr到类.

比方说,我有一个带有B的A类,而来自A的C.
我希望能够创建一个地图

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段要求shared_ptr<>的构造函数接受一个显式的原始指针:

template<typename Y> explicit shared_ptr(Y* p);

问题是你正在尝试构造std :: pair< int,shared_ptr< A>>的实例.通过将原始指针作为第二个参数传递给对<>的构造函数,该构造函数接受shared_ptr< A>.基本上,这与以下相同:

pair<int,shared_ptr<A>> mymap(1,new B()); // ERROR!pair<int,shared_ptr<B>(new B())); // OK

这就是说,除非你有充分的理由去做其他的并且你真的知道你在做什么,最好还是使用std :: make_shared<>()来创建共享指针,这都是因为效率(它执行一个内存)分配而不是两个)和异常安全(如果B或C的构造函数抛出异常,它将不会泄漏).因此,您的地图初始化应如下所示:

const map<int,make_shared<B>()},make_shared<C>()}    };
总结

以上是内存溢出为你收集整理的c – 初始化一个const映射,其中shared_ptr为值全部内容,希望文章能够帮你解决c – 初始化一个const映射,其中shared_ptr为值所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1214789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存