2014-01-23 23 views
4

我有一個類C,它沒有定義operator=。我試圖使用像這樣的矢量:std::vector<std::pair<C,D>> vec;。現在,我的問題是,我完成後無法擦除這對。編譯器抱怨C缺少operator=。我能否擁有一個沒有這個操作符的類的向量?我如何解決這個問題?我無法將作業添加到C。這是錯誤我得到:std :: vector :: erase(item)需要賦值運算符來定義item?

error C2582: 'operator =' function is unavailable in 'C' C:\...\include\utility 196 1 my-lib 

這是我的代碼:

void Remove(const C& c) 
{ 
    auto i = cs_.begin(); 
    while(i != cs_.end()) { 
     if (i->first == c) { 
      cs_.erase(i); // this is the problem 
      break; 
     } 
     i++; 
    } 
} 

其中cs_是:

+0

代寫您想要刪除的代碼 – UldisK

回答

4

的原因是擦除將重新分配你的對象,如果你擦除與std::vector::end()不同的位置。重新分配意味着複製。

請注意,不可複製類型的矢量只能部分使用。在我們有emplace()(pre-C++ 11)之前,它甚至是不可能的。如果你的課程是可複製的,那你爲什麼不定義一個賦值操作符呢?

一種解決方法可以是像std::vector<std::unique_ptr<C>>

+0

Got it!我無法修改'C'。我猜賦值沒有被定義,所以開發人員不能進行復制,但給出了複製構造函數,以便它可以按值傳遞。這甚至有意義嗎?我通過使用'std :: list'而不是'std :: vector'來解決問題。我注意到,即使列表下面也不起作用:'cs_.erase(std :: remove_if(cs_.begin(),cs_.end(), \t \t [p](std :: pair c){返回c.first == p;}), \t cs_.end());' – 341008

1

這是正確的smartpointers(或正常指針)的向量。該標準要求向量中的項目或外向項目是MoveAssignable如果erase要工作。

一般來說,vector和deques需要能夠從任意位置擦除。當他們這樣做時,他們需要能夠將剩餘物品轉移到被擦除物品騰空的空間中。該標準說(或暗示,無論如何,它的MoveAssignable要求erase),他們通過分配,因此包含的項目需要一個賦值運算符。另一個選項可能已被拷貝構造函數複製的項目,但這不是如何完成的。

+0

拷貝構造函數不是一個選項,因爲我們已經有了現有的對象 – Paranaix

+0

所以銷燬它們@Paranaix。調用析構函數,然後使用新的放置位置將相鄰的項目複製到空出的空間中。 –

+0

謝謝,投票贊成:) – 341008

相關問題