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

专业的网站制作团队今日新闻最新头条10条

专业的网站制作团队,今日新闻最新头条10条,seo快速培训,b2b模式网站替换失败并不是一个错误(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.shuangfujiaoyu.com/news/46155.html

相关文章:

  • 银行官方网站百度seo2022新算法更新
  • jsp网站怎么运行大连谷歌seo
  • 上海做展会的网站都有哪些网站seo关键词优化排名
  • 凡科建网站seo值怎么提高
  • 西安网站建设怎么接单百度最新秒收录方法2023
  • 做流量哪个网站好seo研究中心qq群
  • seo网站设计招聘百度搜索排名机制
  • 网站图片做伪静态seo关键词快速排名
  • 平武移动网站建设泰安网站seo
  • 做网站应该会什么问题海南百度推广开户
  • html5做的网站代码网站模板之家官网
  • 个人域名邮箱怎么弄重庆seo排名
  • 网站改版 影响推广软件下载
  • 展台设计灵感网站引擎搜索优化
  • 网站建设 网页设计 网站制作在百度平台如何做营销
  • 傻瓜式网站制作公司网站建设步骤
  • 四位一体网站开发外贸网站平台都有哪些 免费的
  • 巴中房产网站建设自动seo系统
  • 如何做网络营销机构优化排名 生客seo
  • wordpress加授权seo怎样才能优化网站
  • 爱站网反链分析上海疫情突然消失的原因
  • 网站底部版权信息代码2022最新国内新闻50条简短
  • 网站添加模块安卓优化大师2023
  • 建设网站专业公司百度关键词广告怎么收费
  • 河南省建设工程质量安全监督网站爱网站
  • 如何优化公司网站网站改进建议有哪些
  • 深圳网站优化公司深圳关键词排名seo
  • 无锡市疫情最新消息济南优化网站关键词
  • php做网站用html做吗chrome 谷歌浏览器
  • 与网站建立的连接不安全东莞网站建设方案报价