Подтверждено использование двух одноименных переменных среды:
VIRTUALENVWRAPPER_PYTHON
- какая версия Python используется самой утилитой virtualenvwrapper. Другими словами, какая версия Python выполняет virtualenvwrapper
, как если бы эта версия Python была явно названа в строке #!
файла сценария virtualenvwrapper.
VIRTUALENV_PYTHON
- какая версия Python будет установлена virtualenv
при создании новой виртуальной среды. Эквивалент опции -p / --python
в командной строке virtualenv
.
И, возможно, очевидно :) версия Python, запускаемая в виртуальной среде, - это версия, которую вы устанавливаете для этой среды - она не имеет отношения к указанным выше переменным среды после создания env.
См. https://stackoverflow.com/a/24724360/763269 , чтобы узнать, как обновить Python в virtualenv.
Во-первых: ваш класс 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 в картах и мультикартах.
Я только что повозился с unique_ptr в gcc 4.6.0. Вот некоторый (очень некрасивый) код, который работает правильно:
std::map<int, std::unique_ptr<int> > table;
table.insert(std::pair<int, std::unique_ptr<int>>(15, std::unique_ptr<int>(new int(42))));
table[2] = std::move(table[15]);
for (auto& i : table)
{
if (i.second.get())
printf("%d\n", *i.second);
else
{
printf("empty\n");
i.second.reset(new int(12));
}
}
printf("%d\n", *table[15]);
Вывод 42, пустой, 12 - так что, очевидно, он работает. Насколько я могу судить, единственная «проблема» - это ужасно выглядящая команда вставки. emplace не реализован в gcc 4.6.0