Я использую std::unique_ptr
с пользовательским удалителем в качестве значения std::map
следующее:
#include <iostream>
#include <memory>
#include <map>
void deleter(int* p){
std::cout<<"Deleting..."<<std::endl;
delete p;
}
int main()
{
std::map<char, std::unique_ptr<int, void(*)(int*)>> a;
std::unique_ptr<int, void(*)(int*)> p{new int{3}, deleter};
a['k'] = std::move(p);
}
При вставке значения я использую std::move
, но он не скомпилируется.
Что я делаю неправильно?
Вы видите ошибки по ссылке.
a['k']
по умолчанию создаст тип значения карты, если ключ не существует. Так как ваш unique_ptr
использует пользовательский удалитель, он не может быть создан по умолчанию. Вам придется использовать либо map::emplace()
или же map::insert()
добавить unique_ptr
на карту. Если вы хотите узнать, существует ли элемент, или нет, прежде чем вы это сделаете, вы можете использовать либо map::count()
или же map::find()
.
Если вы можете использовать C ++ 17, вы можете использовать map::try_emplace()
вместо этого, который только добавит объект, если ключ не существует, сохраняя вас поиск.
Ошибка заключается в построении записи по умолчанию перед назначением!
Извините, что нет времени прорабатывать ответ, но в целом я бы использовал вместо этого вставку?