C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 初始化一个const映射,其中shared_ptr为值大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图创建一个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>()}
    };
@H_607_45@

大佬总结

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。