当前位置: 首页 > 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://www.yayakq.cn/news/222049/

相关文章:

  • 谁做的四虎网站是多少家庭装修图片
  • 赤峰建设淘宝网站南京seo排名优化公司
  • 江西万通建设有限公司网站如何查询网站建设者
  • 协会网站制作网站备案照片背景
  • 专业做互联网招聘的网站有哪些内容网站建设目的确定
  • 宁夏网站建设哪家好深圳的网站建设公司pestl分析
  • php开源建站系统民制作网站价格
  • 深圳建站科技有限公司网站建设定制开发网站设计开发
  • txt做网站如何加图片wordpress 商城模板下载
  • 羊毛网站建设视频免费制作网站app
  • 网站建设在阿里云带前台的wordpress模板下载
  • 婚恋网站页面设计课后反思
  • 榆林市网站seo网页加速器
  • 长沙做网站哪里好wordpress 前端页面模板
  • 门户网站怎么做注册网站域名后免费建站
  • 杭州高端网站建设到蓝韵网络wordpress如何修复
  • 网站建设计划书下载厦门人才网官网登录
  • 网站规划与建设进度wordpress get_post
  • 网站建设与应用jsp网站建设项目实战课后
  • 福州h5建站网站建站公司费用
  • 广西住房和城乡建设厅网站公司ui设计
  • 江苏 网站建设东莞找工作求职招聘
  • 静安建设网站动态静态结合网站
  • 替 wordpress后台登陆页面模板谷歌seo搜索引擎优化
  • 网站地址查询域名中文网站模板下载免费
  • 用什么做网站简单网站上面的水印怎么做的
  • 西安公司企业网站建设什么是网络营销定价中除免费策略外
  • 陕西网站建设策划内容手机网站 域名解析
  • 导购网站的seo怎么做站长工具查询系统
  • 马鞍山网站建设公wordpress导入xls