问题是您试图从原始指针隐式构造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);
问题是您试图通过将原始指针作为第二个参数传递给pair<> 的构造函数来构造std::pair<int, shared_ptr<A>> 的实例,该构造函数接受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>()}
};