我正在尝试创建一个键为 int 的 const 映射,第二个值是 shared_ptr 到一个类。
比方说,我有一个带 B 的类 A,而 C 派生自 A。我希望能够创建一个地图
const map<int, shared_ptr<A>> mymap
并使用以下值初始化地图:
{1, new B()} and {2, new C()}
但是使用初始化列表会出错。关于我该怎么做的任何帮助?
我正在尝试创建一个键为 int 的 const 映射,第二个值是 shared_ptr 到一个类。
比方说,我有一个带 B 的类 A,而 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 段要求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>()}
};