Во-первых: ваш класс Foo действительно очень плохое приближение std :: string.Я предсказываю много утечек памяти.(Найдите «правило трех».)
Второе: указатель не может быть неявно преобразован в объект unique_ptr (по соображениям безопасности).Но конструктор шаблонных пар требует, чтобы аргументы были неявно конвертируемыми в соответствующие типы значений.GCC, кажется, позволяет это, но это ошибка.Вы должны создать объект unique_ptr вручную.К сожалению, в черновике C ++ 0x отсутствует следующий очень полезный шаблон функции, который облегчает создание временных объектов unique_ptr.Он также безопасен для исключений:
template<class T, class...Args>
std::unique_ptr<T> make_unique(Args&&... args)
{
std::unique_ptr<T> ret (new T(std::forward<Args>(args)...));
return ret;
}
Кроме того, давайте использовать новую функцию emplace вместо insert :
auto a = bar.emplace(1,make_unique<Foo>("one"));
emplace перенаправляет оба аргумента в соответствующий конструктор пары.
Фактическая проблема, с которой вы столкнулись, заключается в том, что конструктор пары пытался скопировать unique_ptr, даже если такой объект является только «подвижным».Похоже, что поддержка GCC в C ++ 0x еще недостаточно хороша для правильной обработки этой ситуации.Из того, что я могу сказать, моя строка сверху должна работать в соответствии с текущим стандартным черновиком (N3126).
Редактировать: Я только что попробовал следующее в качестве обходного пути, используя GCC 4.5.1 вэкспериментальный режим C ++ 0x:
map<int,unique_ptr<int> > themap;
themap[42].reset(new int(1729));
Это также должно работать в следующем стандарте, но GCC также отклоняет его.Похоже, вам нужно подождать, пока GCC поддержит unique_ptr в картах и мультикартах.