以下代码可以正常使用:
std::map<std::string,std::ofstream*> m_jsTabFilesMap;
m_jsTabFilesMap.insert({ listOfTabNames[i], new std::ofstream(jsFilename)});
但是如果我用共享指针替换普通指针,那么insert函数会抱怨函数insert()
的重载版本不存在。
std::map<std::string, std::shared_ptr<std::ofstream>> m_jsTabFilesMap;
我该如何解决这个问题?是否与我使用new实例化对象的方式有关。
答案 0 :(得分:8)
std::shared_ptr<T>
的构造函数T*
是explicit
,并且有充分的理由。
这意味着您必须更改插入函数的方式。保持异常安全,原始指针 - &gt;智能指针转换通常应该一次发生一次,或通过函数发生。在您的情况下,最好使用std::make_shared
:
std::map<std::string, std::shared_ptr<std::ofstream>> m_jsTabFilesMap;
m_jsTabFilesMap.insert({ listOfTabNames[i], std::make_shared<std::ofstream>(jsFilename)});