问题解决——在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,所以能遇到这个问题我很是高兴,不仅仅是规范代码和代码规范。
问题解决——在STL的queue中使用自定义类的更多相关文章
- cocos2d-x 3.0 在lua中调用自定义类
环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7 ...
- WebService中使用自定义类的解决方法(5种)
转自:http://www.cnblogs.com/lxinxuan/archive/2007/05/24/758317.html Demo下载:http://files.cnblogs.com/lx ...
- Python中使用自定义类class作为海量数据结构时内存占用巨大的问题
最近碰到处理一个二十多兆的文件时内存蹭蹭的吃掉四百多兆,吓死宝宝了. 无奈毕竟接触python时间有限,还没有完整的看过python的一些基础知识,我想一个合格的pythoner应该不会碰到这个问题. ...
- Java中使用自定义类封装数组,添加类方法实现数据操作
1.具体见注释 2.后续或有更新 public class MyArray { private long[] array; private int cnt; // 自定义数组类的元素个数 /** 使用 ...
- YII中引用自定义类
如果通过actions方法引用其他自定义类时 <?php class LoginController extends Controller { public function actionInd ...
- JNI:在线程或信号处理函数中访问自定义类
在写一个Tomcat应用,类需要被信号处理函数回调,可是在单独的程序中测试没用问题: void OnSingalHandler(int sig) { ... JNIEnv* env=NULL; if ...
- python中使用自定义类实例作为字典的key
python中dict类型的key值要求是不可变类型,通常来说,我们一般采用int或者str类型来作为字典的key,但是在某些场景中,会造成一定的麻烦. 如我们有一个处理http Request的规则 ...
- HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...
- MFC中 自定义类访问主对话框控件的方法
之前一直在找有木有好点的方法.现在终于被我找到,收藏之~~~~~~ 在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件.控制对话框的 ...
随机推荐
- Struts2的基本流程的详细介绍
Struts2基本流程 概述: Struts2框架由三部分构成:核心控制器.业务控制器和用户实现的业务逻辑组件.在这三部分中,struts2框架提供了核心控制器StrutsPrepareAndExec ...
- Qt Style Sheet实践(一):按钮及关联菜单
导读 正如web前端开发中CSS(Cascade Style Sheet)的作用一样,Qt开发中也可以使用修改版的QSS将逻辑业务和用户界面进行隔离.这样,美工设计人员和逻辑实现者可以各司其职而不受干 ...
- win8.1注册表-修改资源管理器的默认路径regedit
默认情况下,激活Win8的资源管理器都是直接打开库,对于习惯了以前版本的Windows用户来说,还要重新选择“计算机”才能进入相应的磁盘寻找文件,操作起来很是不便.为此,可以进行设置,让资源管理器默认 ...
- C#设计模式——工厂方法模式(Factory Method Pattern)
一.概述在软件系统中,经常面临着“某个对象”的创建工作,由于需求的变化,这个对象的具体实现经常面临着剧烈的变化,但是它却拥有比较稳定的接口.如何应对这种变化?如何提供一种封装机制来隔离出“这个易变对象 ...
- 安装、部署... Windows服务 .net程序 安装 命令
@echo offInstallutil.exe 程序目录 F:\test\TestWindows.exe 服务程序目录@sc start "服务名称"@sc config &qu ...
- C#递归题目代码
一列数的规则如下: 1.1.2.3.5.8.13.21.34...... 求第30位数是多少, 用递归算法实现. 代码: public class MainClass { public static ...
- margin的使用方法与技巧
1.margin还可以用来做平移,作用类似translate哈哈.将元素设成absolute后就可以用margin随便平移他了,既不像relative那样要霸占空间,又不用为父元素设置relative ...
- vs2008不能创建C#项目的解决方法
解决方法:1.先关闭 Visual Studio 2008 ;2.在运行中输入命令"devenv.exe /setup"3.运行 Visual Studio 2008 ,一切搞定. ...
- 从零开始学习Linux(ls命令)
学习Linux已经两年了,可是仍然是小白一个.用过很多命令,可是很多都没记住,基础不扎实,很大程度上是不记笔记,得过且过. 从今天起,开始整理Linux笔记. Linux每个命令都有--help这个选 ...
- 后缀数组---Milk Patterns
POJ 3261 Description Farmer John has noticed that the quality of milk given by his cows varies from ...