本文原创,转载请保证文章的完整性,并显要的注明出处。
本文链接: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,所以能遇到这个问题我很是高兴,不仅仅是规范代码和代码规范。