私は必要なプロジェクトの1つに取り組んでいます
_class MyObj;
map<string, MyObj*> myMap;
_
ここに、ファイル名をMyObjクラスにマップするロジックがあります。
以下を挿入しようとすると
_string strFilename = "MyFile";
MyObj* pObj = new MyObj();
myMap.insert(strFileName, pObj); // This line throwing following error.
_
'std::map<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, void*, std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<const std::basic_string<char, std::char_traits<char>, std::allocator<char> >, void*> > >::insert(std::string&, void*)'
の呼び出しに対応する関数がありません
誰も私にこれを解決する方法を助けてくれますか? STLを使用してこれを行うことができるより良い方法はありますか
私はそれをより読みやすくするためにこれをtypedefしました...
typedef std::map<std::string, MyObj*> MyMap;
typedef std::pair<std::string, MyObj*> MyPair;
MyMap myMap;
string strFilename = "MyFile";
MyObj* pObj = new MyObj();
myMap.insert(MyPair(strFilename, pObj));
挿入関数を使用する場合、std :: mapにはペアが必要です。
次の2つのオプションがあります。
myMap[strFileName] = pObj;
または:
myMap.insert(std::make_pair(strFileName,pObj));
myMap.insert(strFileName、pObj);
make_pair()
をinsert()
内で使用します
#include <utility>
//...
myMap.insert (std::make_pair(strFileName, pObj) ) ;
キーと値を引数として取るinsert
メンバーはありません。インデックス演算子を使用するだけです:
myMap[fileName] = obj;
map<string,MyObj*> myMap;
string strFilename = "MyFile";
MyObj* pObj = new MyObj();
myMap[strFilename] = pObj;
うまく動作するはずです。マップをクリアしても、ポインタが指しているメモリが解放されないことに注意してください。
挿入はペアを必要としています、次のようなことを試してください:
mymap.insert ( pair<string,MyObj*>(strFilename,pObj) );
Boost :: ptr_mapを試してください(boost :: ptr_containerライブラリーから)。そしてboost :: assignライブラリを使用すると、newを手動で呼び出す必要さえありません。
class MyObj {
MyObj() { /* some... */ }
};
typedef boost::ptr_map< string, MyObj > MyMap;
MyMap m;
using namespace boost::assign;
ptr_map_insert( m )( "first" )( "second" )( "third" );
この場合、3つの要素がmに追加されます(キー「first」、「second」、「third」、および作成された3つのオブジェクトMyObj()を使用)。
または:
class MyObj {
MyObj( int _i ) : i( _i ) { /* some... */ }
int i;
};
typedef boost::ptr_map< string, MyObj > MyMap;
MyMap m;
using namespace boost::assign;
ptr_map_insert( m )( "first", 1 )( "second", 2 )( "third", 3 );
この場合、3つの要素がmに追加されます。最初の要素にはキー「first」と値MyObj(1)があり、2番目-キー「second」とMyObj(2)、3番目-キー「third」とMyObj(3)があります。
insert()
を誤って呼び出しています。キーと値を別々に受け取るのではなく、次のようなペアを受け取ります。
myMap.insert(pair < string, MyObj* > (strFileName, pObj));
Boost :: ptr_map()を試す