原由是把以前寫的類中的 mutex 使用了(以前註釋掉了沒用到這個變量); 多線程
或者說添加了一個 mutex 變量, 而後 這個類有嵌套在了 其類的 map 中使用, 而後 編譯 就報錯svn
`函數
C2280 XXX:XXX(const XXX &) 嘗試引用已刪除的函數spa
C2280 XXX::operator=(const XXX &) 嘗試引用已刪除的函數線程
`編譯
手動添加 這倆函數, 依然包錯table
死活折騰不起做用, 在網上搜的, 說什麼 const 變量啦,析構函數啦.... 等等都無效class
後來, 折騰的沒辦法, 從新 check 上個版本的 工程( 嗯, 幸虧有svn )變量
而後 一點一點 添加變化, 添加一點 編譯一次,添加一點 編譯一次構造函數
終於發現, TMD 是添加 了 mutex 變量後 就報錯的
而後網上 搜了下, 直接給瞭解釋:
`
因爲std::mutex的拷貝構造函數被禁了:
mutex( const mutex& ) = delete;
`
麻蛋!~
而 std::vector 和 std::map 都是要求 類型 必須包含拷貝構造函數的,因此就報錯了。
且 即時 添加 mutable 關鍵字,也無效的.
最簡單的方法就是 :
把 std::mutex _mutex ;改爲 std::shared_ptr<std::mutex> _mutex 就能夠了
使用的時候
std::lock_guard<std::mutex> _lock{ *_mutex }; // `*`解釋獲得
或者本身手動 這兩個函數吧....
看狀況, 若是擔憂 多線程 是什麼莫名其妙的鎖了, 就手動 咯, 雖說寫的