1. 程式人生 > >問題解決——在STL的queue中使用自定義類

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

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

平時很少用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,所以能遇到這個問題我很是高興,不僅僅是規範程式碼和程式碼規範。