我正在尝试使用key创建一个const map作为int,第二个值是shared_ptr到类。
假设我有一个带有B的A类,而C来自A。 我希望能够创建地图
const map<int, shared_ptr<A>> mymap
并使用值
初始化地图{1, new B()} and {2, new C()}
但是使用初始化列表会出错。 有关如何做到这一点的任何帮助?
答案 0 :(得分:7)
问题是您正在尝试从原始指针隐式构造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<>
的构造函数接受原始指针为explicit
:
template<typename Y> explicit shared_ptr(Y* p);
问题在于您尝试通过将原始指针作为第二个参数传递给std::pair<int, shared_ptr<A>>
的构造函数来构造pair<>
的实例,该构造函数接受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>()}
};