比方说,我有一个带有B的A类,而来自A的C.
我希望能够创建一个地图
const map<int,shared_ptr<A>> mymap
并使用值初始化地图:
{1,new B()} and {2,new C()}
但使用初始化列表会出错.
有什么帮助我怎么能这样做?
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为值所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)