вставка ptr_map - PullRequest
       36

вставка ptr_map

3 голосов
/ 18 июня 2010

У меня есть некоторый предопределенный тип, который наследует boost :: noncopyable (поэтому я должен хранить указатель на эти объекты). Я использую boost :: ptr_map . Как я знаю, вторым аргументом в нем уже является указатель. Итак, код:

ptr_map<string, boost::any> SomeMap;
typedef %Some noncopyable class/signature% NewType;

// Inserting now
boost::any *temp = new boost::any(new KeyEvent());
SomeMap.insert("SomeKey", temp);

Ошибка:

error: no matching function for call to ‘boost::ptr_map<std::basic_string<char>, boost::any>::insert(const char [11], boost::any*&)’


UPD : когда я не передаю указатель на любой any temp = any(new KeyEvent());

Я получаю:

error: no matching function for call to ‘boost::ptr_map<std::basic_string<char>, boost::any>::insert(const char [11], boost::any&)’

1 Ответ

6 голосов
/ 18 июня 2010

Эта версия insert принимает ключ по неконстантной ссылке, что означает, что вы не можете использовать временное значение в качестве первого значения. Это для предотвращения утечек памяти; в вашем коде temp протечет, если будет сгенерирован строковый конструктор.

Вы должны создать ключевой объект перед созданием необработанного указателя:

string key("SomeKey");
any* temp = new whatever;
SomeMap.insert(key, temp);

или используйте auto_ptr, чтобы гарантировать, что объект будет удален, что бы ни случилось:

auto_ptr<any> temp(new whatever);
SomeMap.insert("SomeKey", temp);
...