我注意到,當包含類型包含unique_ptr時,不可能刪除矢量的元素。如何在包含對象包含unique_ptr時刪除矢量的元素?
例如這個類:
class Bar
{
std::unique_ptr<int> pointerTest;
Bar(Bar &bar) {};
public:
Bar() { pointerTest = std::unique_ptr<int>(new int); }
Bar(Bar &&bar) { this->pointerTest = move(bar.pointerTest); }
void testFunc() { pointerTest.release(); }
};
這不會與這種用法工作:
int main()
{
vector<Bar> test123;
Bar foo;
test123.push_back(move(foo));
test123.erase(test123.begin());
}
//Error 1 error C2280: 'std::unique_ptr<int,std::default_delete<_Ty>> &std::unique_ptr<_Ty,std::default_delete<_Ty>>::operator =(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)' : attempting to reference a deleted function c:\program files (x86)\microsoft visual studio 12.0\vc\include\xmemory0 611 1 testing
的代碼將工作時,你只調用對象的方法,而不是擦除:
for (auto &item : test123)
item.testFunc();
爲什麼我不能在矢量上使用擦除,我該如何解決這個問題?
FWIW,你的代碼在g ++ 4.6下編譯。 – user4815162342
我可以通過刪除不必要的移動構造函數和奇怪的副本構造函數來解決GCC 4.8上的問題。我不知道問題到底是什麼,或者是否會爲您的編譯器解決問題。 –
奇怪的是,我無法在visual studio 2013上編譯此文件,無論是否帶有複製和移動構造函數。 @Mike Seymour關於這些構造函數的連線是什麼? – Dagob