問題解決——在STL的queue中使用自定義類

本文原創,轉載請保證文章的完整性,並顯要的註明出處。

本文鏈接:http://blog.csdn.net/wlsgzl/article/details/38843513

平時很少用STL,就算用,也基本是使用queue<int>之類的簡單數據類型,偶爾在MFC裏寫點小代碼,用的也是queue<CString>。

(求不要吐槽我爲什麼用CString不用string,在MFC裏使用CString真的很方便,我對內存利用率和處理速度又沒有什麼要求,能跑就行,請勿吐槽。)

======================雙宿雙棲的分割線===========================

當這次我使用自定義的類時,出問題了。

作爲一隻工作在最底層的小猴子,兢兢業業,任勞任怨,寫類代碼的時候,不管有用沒用,習慣上加上“拷貝構造函數”和“重載=”。

於是我正常的聲明瞭

	std::queue<CDataRecv> m_queDataRecv;
然後隨手一編譯,輸出了好多東西。(爲了不泄露資料,我把相關路徑使用了XXXXXXXXX代替)

c:\program files\microsoft visual studio 10.0\vc\include\xmemory(48): error C2558: class“CDataRecv”: 沒有可用的複製構造函數或複製構造函數聲明爲“explicit”
1>          c:\program files\microsoft visual studio 10.0\vc\include\xmemory(197): 參見對正在編譯的函數 模板 實例化“void std::_Construct<CDataRecv,const _Ty&>(_Ty1 *,_Ty2)”的引用
1>          with
1>          [
1>              _Ty=CDataRecv,
1>              _Ty1=CDataRecv,
1>              _Ty2=const CDataRecv &
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\xmemory(196): 編譯類 模板 成員函數“void std::allocator<_Ty>::construct(CDataRecv *,const _Ty &)”時
1>          with
1>          [
1>              _Ty=CDataRecv
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\deque(721): 參見對正在編譯的類 模板 實例化“std::allocator<_Ty>”的引用
1>          with
1>          [
1>              _Ty=CDataRecv
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\deque(773): 參見對正在編譯的類 模板 實例化“std::_Deque_val<_Ty,_Alloc>”的引用
1>          with
1>          [
1>              _Ty=CDataRecv,
1>              _Alloc=std::allocator<CDataRecv>
1>          ]
1>          c:\program files\microsoft visual studio 10.0\vc\include\queue(22): 參見對正在編譯的類 模板 實例化“std::deque<_Ty>”的引用
1>          with
1>          [
1>              _Ty=CDataRecv
1>          ]
1>          d:\XXXXXXXXXXXXXXXXXXXXXXXXXXX\mscommwls.h(126): 參見對正在編譯的類 模板 實例化“std::queue<_Ty>”的引用
1>          with
1>          [
1>              _Ty=CDataRecv
1>          ]
這裏面有個很關鍵的問題,通常,當我看到下面的內容時,自然會查看自己的那一堆構造函數,看看是不是少寫了一個。但是這次我確信我寫了。
沒有可用的複製構造函數或複製構造函數聲明爲“explicit”

於是接着往下看

void std::_Construct<CDataRecv,const _Ty&>(_Ty1 *,_Ty2)”的引用
1>          with
1>          [
1>              _Ty=CDataRecv,
1>              _Ty1=CDataRecv,
1>              _Ty2=const CDataRecv &
1>          ]
這個很重要,注意到了沒有:
const _Ty&
<pre name="code" class="cpp">_Ty2=const CDataRecv &


STL出於“你懂得”目的,使用了const作限制,而我自定義類的拷貝構造函數恰好沒有加const,問題找到了!

於是趕緊給拷貝構造函數加上const修飾,問題解決了。

現在想來,有時候,並不僅僅是防止修改的問題,當要使用其他現有工具時,應當符合該工具的要求/規範。

-------------------------------------------分割線?不,我是單身狗。-------------------------------------------

因爲很少使用STL,所以能遇到這個問題我很是高興,不僅僅是規範代碼和代碼規範。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章