当前位置: 首页 > news >正文

网站建设与管理属于计算机专业吗谷歌浏览器下载

网站建设与管理属于计算机专业吗,谷歌浏览器下载,河南省做网站的公司有哪些,优秀app界面设计案例在自己实现C中list的时候,当实现const迭代器的时候,发现报错了,一直思考到现在 才发现是一个,很简单的问题,但是也让我有了一点感受,我在这里给大家分享一下。文章目录 1.当时遇到的问题2.解决方法3. 自己的…
在自己实现C++中list的时候,当实现const迭代器的时候,发现报错了,一直思考到现在
才发现是一个,很简单的问题,但是也让我有了一点感受,我在这里给大家分享一下。

文章目录

  • 1.当时遇到的问题
  • 2.解决方法
  • 3. 自己的感悟

1.当时遇到的问题

这是list的构造函数部分
在这里插入图片描述
这是list迭代器调用的部分。
在这里插入图片描述
当我运行这样一段代码的时候,会出现这样的错误:
在这里插入图片描述
看得更清楚一点:
在这里插入图片描述
而这么写的时候是没问题的:

void Print(const zsw::list<int>& ls)
{zsw::list<int>::const_iterator cit = ls.begin();while (cit != ls.end()){cout << *cit << endl;cit++;}
}int main()
{zsw::list<int> ls;ls.push_back(1);ls.push_back(2);ls.push_back(3);ls.push_back(4);Print(ls);//zsw::list<int>::const_iterator cit = ls.begin();//while (cit != ls.end())//{//	cout << *cit << endl;//	cit++;//}return 0;
}

在这里插入图片描述

我当时想不通,为什么会出现这样的问题。
我一直以为这个问题是出现在begin函数上,因为我当时想的是,我左边是const迭代器对象,begin函数有两个一个是普通版本,一个是const版本,我一直认为右边的begin函数的返回值是:
在这里插入图片描述
这里就出现了第一个错误,不理解函数重载的功能,调用重载函数,区别应该是体现在调用对象和传的参数上来体现。这里的ls是普通对象,所以调用的应该是普通版本的begin函数。
既然是调用的普通begin函数返回的就是普通迭代器,这就是问题的所在,我begin函数返回的的对象类型是Iterator<int, int& int*>,而对象cit的类型是Iterator<int, const int& const int*>,两者是不同的类型,而在cit的模板类实例化之后,cit是没有关于Iterator<int, int& int*>类型的构造函数的:
在这里插入图片描述

2.解决方法

它这里的构造函数只有用节点或者同类型的迭代器来初始化。
所以我们只需要添加这样的一个构造函数。
在这里插入图片描述
可以看到它是一个模板函数,这样就可以通过Iterator<int, int& int*>类型来构造Iterator<int, const int& const int*>,而这其中T1和T应该具有相似特性,为了传参正确,更严谨的写法:
在这里插入图片描述
上面的解决方法我是从STL中map的一个返回值理解的:
在这里插入图片描述

我们看到map的插入函数的参数是这样的一个,我们来看看它是什么:
在这里插入图片描述
其实它是一个结构体:

在这里插入图片描述
假如我们现在使用以下map:
在这里插入图片描述
它的编译的没有错误的,这显然与我们上面遇到的问题一样,map的插入函数需要的对象是pair<const key_type,mapped_type>,而对应到这里那它所需要的参数类型是pair<const string,string>,我们传的类型是pair<string, string>这又是两个不一样的类型。那么很显然解决方法就也是从这里来的:
在这里插入图片描述
在pair里就有这么一个模板构造函数。
可以看出这种构造函数又能充当拷贝构造又能充当构造

3. 自己的感悟

我们在上面看到一个pair<string, string>传参给pair<const string,string>的引用,好像跟这里有点相似:
在这里插入图片描述
可以看到它可以编译通过。那看这个,这不就是单个内置类型的成员变量的自定义类型之间的隐式类型转换嘛,要知道内置类型在C++中也是有“构造函数”的。
再看一段代码:

template<class T1, class T2>
class A
{
public:A(){}template<class N1, class N2>A(const A<N1, N2>& a):_a(a._a), _b(a._b){}T1 _a;T2 _b;
};void func(const A<double, double>& a)
{cout << "void func(A<const string, string> a)" << endl;
}int main()
{A<int, int> a1;func(a1);return 0;
}

在这里插入图片描述
也是能编译通过的。
在这里插入图片描述
那这里能够实现的原因还是因为,有着隐式类型转化的作用。而隐式类型转化又有着更底层的内置类型转换(比如double转int)的构造逻辑,或者是自定义类型本身就有相关类型的构造函数(例如const char*转string)这种转化是基于两种类型具有相似的特性,所以隐式类型转换和不同类型间的构造函数是相辅相成的。
这就是基于list的const迭代器得出的一点感悟,要是错了的话,希望能够改正我。

http://www.mmbaike.com/news/71315.html

相关文章:

  • 如何通过cpa网站做推广信息流广告投放渠道
  • 大连做网站排名河北seo基础知识
  • 公安网站备案流程图腾讯企点账户中心
  • 临沂公司做网站谷歌浏览器手机版官网下载
  • 广州大石附近做网站的公司哪家好网站友情链接查询
  • 免费建自己域名的网站百度游戏风云榜
  • 宁波免费建站外包公司网络推广公司联系方式
  • 营销型网站建设概述sem竞价托管公司
  • html怎么发布网页seo公司网站推广
  • 更换网站模板大数据推广公司
  • 对网站进行优化seo基础知识培训
  • 用照片做视频的模板下载网站好百度地图广告投放
  • 做动态网站 需要哪些知识网络域名怎么查
  • 自己建设一个网站福州百度seo代理
  • wordpress自动更新电视剧抖音seo排名优化软件
  • 重庆网站建设就找承越技能培训网
  • 浦东做营销网站chrome网页版入口
  • 软件开发模型图seo搜索引擎优化期末考试
  • 上海稼禾建设装饰集团网站qq群推广网站免费
  • 动态网站建设实训报告关键词出价计算公式
  • 中国建设工程信息网清欠网站优化费用报价明细
  • 免费建微网站平台申请域名的方法和流程
  • 自己做的网站打开速度慢搜索引擎推广方法
  • 如何用百度上传图片做网站外链刷seo关键词排名软件
  • 政府网站建设招标书seo系统是什么
  • 网站制作网站建设运营团队阿里云域名注册官网
  • 做个营销型网站要多少钱百度手机卫士
  • 免费行情软件在线网站石家庄网站建设培训
  • 建国外网站域名查询ip爱站网
  • 网站制作百度做网站哪家好