问题解决——在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,所以能遇到这个问题我很是高兴,不仅仅是规范代码和代码规范。

时间: 2024-10-28 21:34:30

问题解决——在STL的queue中使用自定义类的相关文章

cocos2d-x 3.0 在lua中调用自定义类

环境 windows8, cocos2d-x 3.0, 现在开始安装需要的一些其它包 1. 按README.mdown文档上面要求的, 下载在windows下要安装的东东, 主要就是python2.7.3, PyYAML-3.10.win32-py2.7, pyCheetah 这些东东在README.mdown上面都给好了连接, 直接下载就行了, 安装好python后, 在系统环境变量的PATH中设置python所在的目录2. 安装android-ndk-r9b, 下载地址:http://dl.

python中使用自定义类实例作为字典的key

python中dict类型的key值要求是不可变类型,通常来说,我们一般采用int或者str类型来作为字典的key,但是在某些场景中,会造成一定的麻烦. 如我们有一个处理http Request的规则类名为Rule,其定义如下,它由一个Request path和其支持的Request methods数组组成: class Rule(object): def __init__(self, path, methods): assert(isinstance(path, str)) assert(is

HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法

之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中,会发生发生什么情况呢? public class Person { private String id; public Person(String id) { this.id = id; } } import java.util.HashMap; public class Main { public

js自定义类与对象

js中创建自定义类与创建对象:js创建类与AS3,java都有很大的不同,,,下面来看看他的庐山真面目..由于js也是一个面向对象的编程语言所以也存在像其他语言那样的创建自定义的类,和通过类来创建对象.js的类是有一下三部门组成1.构造函数2.属性3.方法自定义一个类: function MyClass(id,age,name) { this.id = id; this.age = age; this.name = name; } 从这个类的定义形式可以看出,js定义类的形式和其他语言有很大的不

学习java中对《类与对象》的认知

在学习<类与对象>章节中,我们知道了面向对象的编程语言中,类是一个独立的程序单位,是具有相同属性和方法的一组对象的集合, 在 Java 程序中,自定义类的一般格式为: class 类名 { 数据成员1 数据成员2 数据成员3 …… 成员方法1 成员方法2 } 类的说明部分由关键字 class 与类名组成,注意的是类名的命名遵循 Java 标识符的定义规则.类体是类声明中花括号所包括的全部内容,它又是由成员变量(属性)和成员方法(方法)两部分组成. 说了类,接着就是对象的剖知了,对象是把客观世界

使用Ext.define自定义类

ExtJS 允许用户使用Ext.define 自定义类.本文将通过实例介绍如何使用Ext.define自定义类,并介绍ExtJS 的动态加载(Require方法)的使用方法. Javascript自定义类 在Javascript中,自定义类是这样的: // 在Javascript中,自定义类 var Person = function(name, age) { this.Name = ""; this.Age = 0; this.say = function(msg) { alert(

cocos2dx-3.x 导出自定义类到 lua 过程

一.简介 最近正在学习cocos2d中的lua游戏开发,因为lua开发的热更新特性,大家开发游戏好像都会优先选择lua作为开发语言. 但是遇到一个问题,用lua写一些简单的程序没什么问题,但是一旦需要一个复杂的类,在lua中直接写就感觉有些吃力.所以想到,可以把游戏开发中比较复杂的模块使用c++完成,然后导出到lua,让lua可以轻松调用. 我从头到尾完整地完成了cocos2dx-3.x中自定义类的导出过程,在网上查了好多资料,也碰到了很多错误,然而网上关于这块的文章比较零散,如果有初学者使用的

[Yii2.0] 以Yii 2.0风格加载自定义类或命名空间 [配置使用Yii2 autoloader]

Yii 2.0最显著的特征之一就是引入了命名空间,因此对于自定义类的引入方式也同之前有所不同.这篇文章讨论一下如何利用Yii 2.0的自动加载机制,向系统中引入自定义类和命名空间.本文旨在抛砖引玉,如果有理解不当敬请指正,欢迎大家把自己的方法拿出来分享.我们希望被引入的类应该达成一下两点: 在应用中的任这里输入代码意位置可以使用该类名或命名空间,而不用显式调用require()/include(). 利用Yii的autoloader,仅在类被调用时加载,以遵循Yii按需加载的原则,节省资源. 我

自定义类可序列化

在hadoop框架中实现自定义类可以被序列化. package com.rpc.nefu; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.io.WritableComparable;