zoukankan      html  css  js  c++  java
  • 问题解决——在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 filesmicrosoft visual studio 10.0vcincludexmemory(48): error C2558: class“CDataRecv”: 没有可用的复制构造函数或复制构造函数声明为“explicit”
    1>          c:program filesmicrosoft visual studio 10.0vcincludexmemory(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 filesmicrosoft visual studio 10.0vcincludexmemory(196): 编译类 模板 成员函数“void std::allocator<_Ty>::construct(CDataRecv *,const _Ty &)”时
    1>          with
    1>          [
    1>              _Ty=CDataRecv
    1>          ]
    1>          c:program filesmicrosoft visual studio 10.0vcincludedeque(721): 参见对正在编译的类 模板 实例化“std::allocator<_Ty>”的引用
    1>          with
    1>          [
    1>              _Ty=CDataRecv
    1>          ]
    1>          c:program filesmicrosoft visual studio 10.0vcincludedeque(773): 参见对正在编译的类 模板 实例化“std::_Deque_val<_Ty,_Alloc>”的引用
    1>          with
    1>          [
    1>              _Ty=CDataRecv,
    1>              _Alloc=std::allocator<CDataRecv>
    1>          ]
    1>          c:program filesmicrosoft visual studio 10.0vcincludequeue(22): 参见对正在编译的类 模板 实例化“std::deque<_Ty>”的引用
    1>          with
    1>          [
    1>              _Ty=CDataRecv
    1>          ]
    1>          d:XXXXXXXXXXXXXXXXXXXXXXXXXXXmscommwls.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,所以能遇到这个问题我很是高兴,不仅仅是规范代码和代码规范。


  • 相关阅读:
    PIE SDK SFIM融合
    PIE SDK PCA融合
    c# 粘贴复制
    dev gridview 单元格值拖拽替换
    sql 行数据找出最大的及所有数据最大的
    mvc 登陆界面+后台代码
    mvc控制器返回操作结果封装
    Java 未来行情到底如何,来看看各界人士是怎么说的
    Java工程师修炼之路(校招总结)
    ​为什么我会选择走 Java 这条路?
  • 原文地址:https://www.cnblogs.com/wlsandwho/p/4202091.html
Copyright © 2011-2022 走看看