У меня есть класс реализованный с использованием Pimpl Ideom:Вы можете поставить Pimpl-класс в векторе
class FooImpl {};
class Foo
{
unique_ptr<FooImpl> myImpl;
public:
Foo();
~Foo();
};
А теперь я хочу, чтобы поместить это в станд :: вектор
void Bar()
{
vector<Foo> testVec;
testVec.resize(10);
}
Но когда я делаю это, я получаю ошибку компилятора (VC++ 2013)
ошибка C2280: «станд :: unique_ptr> :: unique_ptr (Const станд :: unique_ptr < _Ty, станд :: default_delete < _Ty >> &)»: попытка сослаться проколотой функцию
я получаю ту же ошибку с testVec.emplace_back();
и testVec.push_back(std::move(Foo()));
(В качестве временного решения, используя vector<unique_ptr<Foo>>
, кажется, работает, но я не понимаю почему код выше не работает)
Рабочий пример:. http://coliru.stacked-crooked.com/a/b274e1209e47c604
Но почему размер или emplace_back должны скопировать в первую очередь? – Niki
@nikie, сделайте конструкцию назначения и копирования закрытой, и вы получите сообщение об ошибке создания шаблона, показывающее полный путь их вызова. 'resize' хочет' erase', 'erase' хочет' _Move', '_Move' использует оператор присваивания. –
@ м.с. Кстати, приведенный пример до сих пор не компилируется в VC, а righlty так. Вызов 'resize' требует операции присваивания, а не перемещения конструктора, возможно, различия в VC/gcc/clang. Поскольку op явно использует VC, это не решение. –