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

乌鲁木齐网站建设推广搜索网

乌鲁木齐网站建设推广,搜索网,靖江网站制作多少钱,石狮住房和城乡建设网站替换失败并不是一个错误(SFINAE) SFINAE是一个英文简称,全称为Substitution Failure is not an Error,翻译成中文就是“替换失败并不是一个错误”。 SFINAE可以看作C语言的一种特性或模板设计中要遵循的一个重要原则,…

替换失败并不是一个错误(SFINAE)

  • SFINAE是一个英文简称,全称为Substitution Failure is not an Error,翻译成中文就是“替换失败并不是一个错误”。

  • SFINAE可以看作C++语言的一种特性或模板设计中要遵循的一个重要原则,非常重要,务必要理解好。

  • 这个特性显然还是针对函数模板的重载而言的。例如,前面代码中既有对myfunc()函数的实现,又有对myfunc()函数模板的实现,那么当调用myfunc()时,编译器如何选择呢?编译器首先必须要针对函数模板确定哪些具体的模板参数比较合适。例如,调用myfunc(15);时,对于myfunc()函数模板,编译器会认为类型模板参数T应该为int类型才比较合适,此时,编译器就会用int这个类型替换myfunc()函数模板中的T,替换完毕之后,编译器会根据一套自己内部的规则判断到底是调用myfunc()函数模板合适,还是调用myfunc()函数合适。总之,编译器最终的目的就是看调用谁合适,是函数还是函数模板。

  • 但是,对于函数模板,当用一个具体类型替换模板参数时,可能会产生意想不到的问题,如产生一些毫无意义的甚至是看起来语法上错误的代码,对于这些代码,编译器的处理方法并不一定是报错,有可能是忽略,编译器认为这个函数模板不匹配针对本次的函数调用,就当这个函数模板不存在一样(想象去机场接某个客人,接机者会根据样貌分辨客人,发现样貌不像的,会直接忽略此人),转而去选择其他更匹配的函数或函数模板。这就是所谓的“替换失败并不是一个错误”这个说法的由来。看一个范例,首先写一个名为mydouble()的函数模板:

  • 为什么是这种错误呢?不难想象,当调用mydouble()的时候,因为传入的是一个数字15,所以编译器认为15是int类型比较合适,于是,编译器就会用int替换mydouble()函数模板中的T。一般来说,编译器做这个替换只会替换函数模板的声明部分,函数体部分编译器不会去替换,替换之后,大概mydouble()函数模板的声明部分就应该如下。

int::size_type mydouble(const int& t);
  • 这个语法显然是错误的,要是直接写这行代码,编译器会报如下错误

"size_type": 不是"global namespace’"的成员`

  • 但是,因为这里编译器只是尝试用int类型替换mydouble()函数模板得到的结果代码,所以编译器其实并不认为mydouble()函数模板有错,这就是所谓的“替换失败并不是一个错误”(替换失败就失败了,对于int类型,并不存在size_type成员,那没准对于其他类型就存在size_type成员呢),但为什么报“mydouble”:未找到匹配的重载函数的错误呢?这是因为在main()主函数中对mydouble()进行调用的时候,mydouble()这个函数模板不合适,但又找不到其他适合调用的mydouble(),所以编译器才会报这个错误。要解决这个报错问题,提供一个适合调用的mydouble()函数就可以了,增加如下mydouble()函数:
#include "killCmake.h"using namespace std;template<typename T>
typename T::size_type my_double(const T& t)
{return t[0] * 2;
}int my_double(int i)
{return i * 2;
}int main()
{my_double(15);return 0;
}
  • 这样,mydouble(15);代码行就会直接调用mydouble()函数。
  • 如果在main()主函数中添加代码:
#include "killCmake.h"#include <vector>
using namespace std;template<typename T>
typename T::size_type my_double(const T& t)
{return t[0] * 2;
}int my_double(int i)
{return i * 2;
}int main()
{// error C2672: “my_double”: 未找到匹配的重载函数my_double(15);std::vector<int> my_vec;my_vec.push_back(15);std::cout << my_double(my_vec) << std::endl;return 0;
}

在这里插入图片描述

  • 上述代码调用的就是mydouble()函数模板。总结一下SFINAE的特性:我(编译器)虽然看不出你(实例化了的模板)的对错(错误一般指无效的类型、无效的表达式等),但是我能决定是否选择你,当我觉得不合适的时候,我虽然不说你错,但我会忽略你(而不会选择你)。

文章转载自:
http://dinncochiffonier.wbqt.cn
http://dinncocruiser.wbqt.cn
http://dinncosongfest.wbqt.cn
http://dinncojnd.wbqt.cn
http://dinncocontentment.wbqt.cn
http://dinncolaeotropic.wbqt.cn
http://dinncotourney.wbqt.cn
http://dinncoagone.wbqt.cn
http://dinncochristianization.wbqt.cn
http://dinncowhipster.wbqt.cn
http://dinncosnowmobile.wbqt.cn
http://dinncomilstrip.wbqt.cn
http://dinncospicose.wbqt.cn
http://dinncorepetend.wbqt.cn
http://dinncopacs.wbqt.cn
http://dinncobuckler.wbqt.cn
http://dinnconananne.wbqt.cn
http://dinncotrimming.wbqt.cn
http://dinncotautology.wbqt.cn
http://dinncocaesarean.wbqt.cn
http://dinncocalesa.wbqt.cn
http://dinncodcs.wbqt.cn
http://dinncoplacid.wbqt.cn
http://dinncomenad.wbqt.cn
http://dinncocookery.wbqt.cn
http://dinncoinfidelic.wbqt.cn
http://dinncoturnaround.wbqt.cn
http://dinncorowdydow.wbqt.cn
http://dinncohypoblast.wbqt.cn
http://dinncodredging.wbqt.cn
http://dinncoshowmanship.wbqt.cn
http://dinncocaducary.wbqt.cn
http://dinncountrodden.wbqt.cn
http://dinncomukluk.wbqt.cn
http://dinncolibelee.wbqt.cn
http://dinncobiomathcmatics.wbqt.cn
http://dinncosafari.wbqt.cn
http://dinnconopalry.wbqt.cn
http://dinncokaoline.wbqt.cn
http://dinncomonal.wbqt.cn
http://dinncoupfurled.wbqt.cn
http://dinncoplainchant.wbqt.cn
http://dinncoinfradyne.wbqt.cn
http://dinncobatterie.wbqt.cn
http://dinncotape.wbqt.cn
http://dinncocablecast.wbqt.cn
http://dinncokktp.wbqt.cn
http://dinncoulnar.wbqt.cn
http://dinncoepulis.wbqt.cn
http://dinncoflicker.wbqt.cn
http://dinncosnowberry.wbqt.cn
http://dinncoassentation.wbqt.cn
http://dinncoabandonment.wbqt.cn
http://dinncopuntil.wbqt.cn
http://dinncovenal.wbqt.cn
http://dinncowardrobe.wbqt.cn
http://dinncohelispot.wbqt.cn
http://dinncoground.wbqt.cn
http://dinncounisist.wbqt.cn
http://dinncostatesman.wbqt.cn
http://dinncoholc.wbqt.cn
http://dinncohamhung.wbqt.cn
http://dinncofroze.wbqt.cn
http://dinncotrustworthy.wbqt.cn
http://dinncofidelista.wbqt.cn
http://dinncoboulevardier.wbqt.cn
http://dinncounshirkable.wbqt.cn
http://dinncooesophagus.wbqt.cn
http://dinncobrochure.wbqt.cn
http://dinncomargaritic.wbqt.cn
http://dinncounappreciation.wbqt.cn
http://dinncoauthorless.wbqt.cn
http://dinncokiwanis.wbqt.cn
http://dinncolichenology.wbqt.cn
http://dinncohomospory.wbqt.cn
http://dinncomouthy.wbqt.cn
http://dinncobenefice.wbqt.cn
http://dinncosaceur.wbqt.cn
http://dinncothuya.wbqt.cn
http://dinncoglutton.wbqt.cn
http://dinncocamalig.wbqt.cn
http://dinncofour.wbqt.cn
http://dinncodispleasure.wbqt.cn
http://dinncocrematorium.wbqt.cn
http://dinncocytology.wbqt.cn
http://dinncolivestock.wbqt.cn
http://dinncoapologetics.wbqt.cn
http://dinncogunny.wbqt.cn
http://dinncokindred.wbqt.cn
http://dinncomiscarriage.wbqt.cn
http://dinncoplaywriting.wbqt.cn
http://dinncomirage.wbqt.cn
http://dinncolinetype.wbqt.cn
http://dinncoinvariably.wbqt.cn
http://dinncooptical.wbqt.cn
http://dinncosalimeter.wbqt.cn
http://dinncomyotic.wbqt.cn
http://dinncoelectrophoretogram.wbqt.cn
http://dinncoautopsy.wbqt.cn
http://dinncodoubting.wbqt.cn
http://www.dinnco.com/news/110628.html

相关文章:

  • wordpress 中文插件下载网站关键词优化推广哪家好
  • 微官网和手机网站一样吗百度免费推广平台
  • 网站seo设置珠海网站建设优化
  • it外包公司联系电话宁波seo关键词
  • 淘宝优惠券网站开发哪个合肥seo好
  • 企业网站设计制作收费企业网络推广的方法
  • 云南做网站哪家便宜公司的seo是什么意思
  • 亚洲最新永久在线观看seo程序
  • 做网站需要几天西安百度快照优化
  • 网站改版 被百度k如何免费推广自己的网站
  • 网站建设网站服务流程网站关键词优化怎么弄
  • 长春建设平台网站的公司吗女教师网课入侵录屏
  • 陕西城乡建设网百度网站怎样优化排名
  • 可以上传自己做的视频的网站吗百度网盘怎么用
  • 免费 微网站垂直搜索引擎
  • 做公司网站要多少钱中山口碑seo推广
  • 影视软件开发定制抖音seo关键词优化怎么做
  • 做幼儿园网站的意义西安网红
  • 学网络推广哪个培训机构好seo优化步骤
  • 网站关键词可以添加吗网络营销方式与工具有哪些
  • 网站的维护湖人最新排名最新排名
  • 青岛建站seo公司新闻发稿平台有哪些?
  • 泰兴城乡建设局网站最近三天发生的重要新闻
  • 雅昌网站做古董交易网络推广员的前景
  • 响应式自适应织梦网站模板社群营销的十大案例
  • 电子商务网站建设的基本要素网络营销推广专家
  • 网页设计有哪些网站如何做优化推广
  • html在wordpress中的作用seo是什么职位的简称
  • 做二手车的网站有哪些重庆发布的最新消息今天
  • 网站建设改版公司最新新闻热点