3

我正在尝试创建一个键为 int 的 const 映射,第二个值是 shared_ptr 到一个类。

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

const map<int, shared_ptr<A>> mymap

并使用以下值初始化地图:

{1, new B()} and {2, new C()}

但是使用初始化列表会出错。关于我该怎么做的任何帮助?

4

1 回答 1

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<>()创建共享指针总是更好,这既是因为效率(它执行一次内存分配而不是两次)和异常安全性(如果构造函数BC抛出异常,它不会泄漏)。因此,您的地图初始化应如下所示:

const map<int, shared_ptr<A>> mymap = {
    {1, make_shared<B>()}, 
    {2, make_shared<C>()}
    };
于 2013-02-13T22:41:57.830 回答