Подтвердить что ты не робот

Как хранить указатели на карте

Я работаю над одним из проектов, для которого требуется

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

4b9b3361

Ответ 1

Я напечатал этот материал, чтобы сделать его более читаемым...

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));

Ответ 2

std:: map требуется пара при использовании функции вставки.

У вас есть два варианта:

myMap[strFileName] = pObj;

Или:

myMap.insert(std::make_pair(strFileName,pObj));

Ответ 3

myMap.insert(strFileName, pObj);

Используйте make_pair() внутри insert()

#include <utility>
//...
myMap.insert (std::make_pair(strFileName, pObj) ) ;

Ответ 4

Нет элемента insert, который принимает ключ и значение в качестве аргументов. Просто используйте оператор индекса:

myMap[fileName] = obj;

Ответ 5

map<string,MyObj*> myMap;

string strFilename = "MyFile";  
MyObj* pObj = new MyObj();

myMap[strFilename] = pObj;

Должно работать нормально. Просто помните, что очистка карты не освобождает память, на которую указывают указатели.

Ответ 6

Вставка хочет пару, попробуйте что-то вроде этого:

mymap.insert ( pair<string,MyObj*>(strFilename,pObj) );

Ответ 7

Попробуйте boost:: ptr_map (из библиотеки boost:: ptr_container). И с boost:: assign library вам даже не нужно вызывать новое вручную:

class MyObj {
    MyObj() { /* some... */ }
};

typedef boost::ptr_map< string, MyObj > MyMap;
MyMap m;

using namespace boost::assign;

ptr_map_insert( m )( "first" )( "second" )( "third" );

В этом случае три элемента будут добавлены в m (с ключами "first", "second" и "third" и с тремя созданными объектами 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 );

В этом случае три элемента будут добавлены в m. Первый элемент имеет ключ "первый" и значение MyObj (1), второй - "второй" и "MyObj (2), третий -" третий "и MyObj (3).

Ответ 8

Вы неправильно вызываете insert(). Он не принимает ключ и значение отдельно, он принимает пару, подобную этой:


myMap.insert(pair &lt string, MyObj* &gt (strFileName, pObj));

Ответ 9

Попробуйте boost:: ptr_map()