我必須使用PIMPL Ideom實現類:你可以把一個PIMPL級矢量內
class FooImpl {};
class Foo
{
unique_ptr<FooImpl> myImpl;
public:
Foo();
~Foo();
};
現在我想把這變成一個std :: vector的
void Bar()
{
vector<Foo> testVec;
testVec.resize(10);
}
但是,當我這樣做,我得到一個編譯錯誤(VC++ 2013)
錯誤C2280:「的std ::的unique_ptr> ::的unique_ptr(常量的std ::的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'想'擦除','擦除'想'_Move','_Move'使用賦值運算符。 –
@ m.s。順便說一句,提供的例子仍然不能在VC中編譯,並且很重要。 'resize'調用需要一個賦值操作,而不是移動構造函數,可能是VC/gcc/clang的區別。由於該操作明確使用VC,因此這不是解決方案。 –