我一直在閱讀this answer關於使用std::make_move_iterator
將元素從std::vector<std::unique_ptr<T>>
移動到另一個。它完美的作品:使用std :: make_move_iterator將std :: list <std :: unique_ptr >>插入另一個時出錯
std::vector<std::unique_ptr<int>> c1;
std::vector<std::unique_ptr<int>> c2;
c1.push_back(std::unique_ptr<int>(new int));
c2.insert(c2.end(), std::make_move_iterator(c1.begin()), std::make_move_iterator(c1.end()));
現在我試着去改變它使用一個不同的容器(std::list
):
std::list<std::unique_ptr<int>> c1;
std::list<std::unique_ptr<int>> c2;
c1.push_back(std::unique_ptr<int>(new int));
c2.insert(c2.end(), std::make_move_iterator(c1.begin()), std::make_move_iterator(c1.end()));
但是編譯失敗:
錯誤C2248:「STD: :unique_ptr < _Ty> :: unique_ptr':無法訪問在類中聲明的私有成員'std :: unique_ptr < _Ty>'
但是,它的工作,如果列表中包含其他對象(如std::string
):
std::list<std::string> s1;
std::list<std::string> s2;
s2.insert(s2.end(), std::make_move_iterator(s1.begin()), std::make_move_iterator(s1.end()));
現在,如果我用another answer從同樣的問題,它採用std::back_inserter
和std::move
,它與兩個std::vector
和std::list
:
std::list<std::unique_ptr<int>> c1;
std::list<std::unique_ptr<int>> c2;
c1.push_back(std::unique_ptr<int>(new int));
std::move(c1.begin(), c1.end(), std::back_inserter(c2));
據我所知,這種解決方案基本上移動每個項目時單獨回到插入第二個容器時。
我的問題是,爲什麼在的std::unique_ptr
std::list
不起作用使用std::make_move_iterator
但它與std::vector
如果列表元素是一個不同類型的呢?
注:我使用Visual Studio 2010中
VS2 010是古老的。 [適用於我](http://rextester.com/AYXH86359)與VS2017。 –
有趣......謝謝! – cbuchart
我不知道它是否有任何解決方法?我有問題中提到的另一個解決方案,但我將無法從VS 2010遷移一段時間 – cbuchart