2017-08-18 9 views
2

以下のコードは正常に動作します:インスタンス化オブジェクトが個別に共有ポインタのためのC++

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; 

これを修正するにはどうすればよいですか?私は新しいものを使用してオブジェクトをインスタンス化する方法とは関係がありますか。

+4

それでも 'm_jsTabFilesMap.insert({listOfTabNames [i]は、新しいのstd :: ofstreamの(jsFilename)})を使用している;'あなたはそれを変更std :: map > m_jsTabFilesMap; 'には? – NathanOliver

答えて

8

T*をとるstd::shared_ptr<T>のコンストラクタは、explicitであり、正当な理由があります。未加工のポインタが渡されたときに所有しているスマートポインタを暗黙的に作成すると、問題が発生する可能性があります。

これは、関数に挿入する方法を変更する必要があることを意味します。例外セーフであるためには、生ポインタ - >スマートポインタ変換は、一度に1つずつ、または関数を介して行われるべきです。あなたのケースでは、それは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)}); 
関連する問題