C++Error2208:…嘗試引用已刪除的函數
在使用自己編寫的類實例化c++stl容器vector時,調用了vector.erase()方法,結果編譯器報了以下錯誤
錯誤 C2280 “(類名)::operator =(const (類名) &)”: 嘗試引用已刪除的函數
從錯誤的內容看,似乎是自己的類的賦值構造函數被嘗試調用卻發現其已被刪除。
在翻閱了資料后發現,erase方法會在將對象刪除后,將所有該對象之后的對象向前移動。此時會調用該對象的賦值構造函數。
一般而言,對象的賦值構造函數如果開發者沒有提供,則編譯器會生成默認的賦值構造函數。然而,默認的賦值構造函數在以下幾種情況會被刪除。
該類含有非靜態的const成員變量
該類含有非靜態的reference成員變量
該類含有不能被拷貝的成員變量
該類含有不能被拷貝的基類
該類含有用戶定義的移動構造函數或者移動賦值函數
自己編寫的類中有const成員變量, 將其改成static 或者去掉const 或者添加賦值構造函數,就可以消除這個error.