2014-02-16 22 views
0

我想製作一個std列表,該列表將包含一個包含唯一指針的類的列表。我不斷收到一個錯誤,說試圖引用一個已刪除的函數。如何製作一個包含唯一指針的類的std列表

據我所知,問題是唯一的指針沒有賦值運算符,列表試圖調用它,但我無法找出解決方法。

這裏是保存指針類代碼:

class ptr_hold 
{ 
public: 
    ptr_hold(std::list<int>& _lst); 
    std::list<int>* get_list(); 
private: 
    std::unique_ptr<std::list<int>> num_list; 
}; 

ptr_hold::ptr_hold(std::list<int>& _lst) 
{ 
    num_list = std::unique_ptr<std::list<int>>(new std::list<int>(_lst)); 
} 

這裏試圖做分配新建分配FY示例代碼:

list<int> lst; 
for (int i = 0; i < 5; i++) 
{ 
    lst.push_back(i); 
} 
ptr_hold ph = ptr_hold(lst); 

list<ptr_hold> ph_list; 
ph_list.push_back(ph); //error 
ph_list.push_back(move(ph)); //error 

如何處理呢?

+0

'ph_list.emplace_back(lst);' – Brian

+0

其實,'ph_list.push_back(move(ph));'對我來說工作得很好。但'emplace_back'更好。 – Brian

回答

2

那麼,你很有可能使用VS,因爲它不會自動爲你生成移動成員函數。 (否則ph_list.push_back(move(ph))將起作用。)

unique_ptr確實有移動賦值運算符,這意味着所有權轉移。要調用移動賦值運算符(或爲此移動構造函數),您需要使用右值。 (T&&,其中T不是作爲模板在這裏,因爲它調用了一些不同的東西)要獲得一個右值,您必須使用臨時值(例如來自函數的返回值),或者您必須手動轉換左值到右值。這是通過std::move(表示意圖)或更多羅嗦static_cast完成的。

要解決此問題,請使用emplace_back或手動聲明正確的構造函數,並使用emplace_backpush_back(move())

---編輯---
注:emplace_back可能不應該要求布展分配構造工作,但試圖從列表中的對象時,你會遇到麻煩。

+0

關於'T &&'的部分現在不知何故與其他部分無關.. – dyp

+0

@dyp注意到並改變了,謝謝。我還發誓,我在你的評論之前就開始了答案。 – Xarn

+0

我有足夠的代表;) – dyp

相關問題