c++模板编程2-函数模板的定义和使用

这篇具有很好参考价值的文章主要介绍了c++模板编程2-函数模板的定义和使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

两阶段编译检查

在实例化模板的时候,如果模板的参数类型不支持模板中用到的操作符,将会遇到编译期错误,例:

class Test
{
    //...
};

template <class T>
T add(T a, T b)
{
    return a + b;
}

int main()
{
    Test a, b;
    add(a, b);
}

以上例子 add(a, b) 会在编译器报错,但在模板定义的地方并没有出现错误提示,这是因为模板是分两步编译的:

  • 在模板定义阶段,模板的检查并不包含类型参数。包含下面几个方面:
    • 语法检查。比如误用了中文符号,少写了分号等;
    • 使用了未定义的不依赖于模板参数的符号(变量名、类型名,函数名等);
    • 未使用模板参数的静态断言;
  • 在模板实例化阶段,模板会被二次检查,尤其是依赖于类型参数的部分;

两阶段的检查,强调了是否与模板参数相关,往往与模板参数无关,第一阶段报错,与模板参数有关,第二阶段报错。

例:

template <class T>
T add(T a, T b)
{
    undefine(); //未定义,与模板参数无关,第一阶段报错

    undefine(a, b); //未定义,与模板参数有关,二阶段报错

    static_assert(sizeof(int) > 100, "Error!"); //与模板参数无关,一阶段报错

    static_assert(sizeof(T) > 100, "Error!");//与模板参数有关,二阶段报错

    return a + b;
}

也就是说,只要你定义了模板,并使用了错误的语法,无论使用与否,在编译器都会导致错误,而第二阶段的检查,只有你在实例化模板后,才会进行。这种规则被称之为“两阶段查找”,此规则给模板的处理带来了一个问题:模板实例化的时候,编译器需要看到模板完整的定义,这和函数编译和链接分离的思想背道而驰,目前我们所掌握的知识只能将模板都定义在头文件中,这实在令人沮丧,但c++是如此的自由、无拘无束,必然是有办法解决这个问题,在此篇中我们先不作赘述。

有些编译器并不会覆盖执行第一阶段中的所有检查。所以如果模板没有被至少实例化一次的话,你可能一直都不会发现代码中的第一阶段错误。文章来源地址https://www.toymoban.com/news/detail-463836.html

到了这里,关于c++模板编程2-函数模板的定义和使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【C++初阶】八、初识模板(泛型编程、函数模板、类模板)

    ========================================================================= 相关代码gitee自取 : C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 【C++初阶】七、内存管理 (C/C++内存分布、C++内存管理方式、operator new / delete 函数、定位new表

    2024年02月04日
    浏览(32)
  • 【C++】泛型编程 ② ( 函数模板与普通函数区别 )

    函数模板与普通函数区别 : 主要区别在于它们能够处理的 数据类型数量 和 灵活性 ; 自动类型转换 : 函数模板 不允许 自动类型转化 , 会进行严格的类型匹配 ; 普通函数 能够进行 自动类型转换 , 内含隐式的类型转化 ; 参数 / 返回值 数据类型 : 普通函数 只接受 特定类型 参数

    2024年02月20日
    浏览(28)
  • 【C++】泛型编程 ③ ( 函数模板 与 普通函数 调用规则 | 类型匹配 | 显式指定函数模板泛型类型 )

    上一篇博客 【C++】泛型编程 ② ( 函数模板与普通函数区别 ) 中 , 分析了 函数参数 类型匹配 下的 普通函数 与 函数模板 的调用规则 ; 为 函数模板 重载了 普通函数 , 普通函数有指定的类型 ; 传入实参 , 调用 普通函数 还是 模板函数 , 是有一定的规则的 ; 普通函数 与 传入实

    2024年02月21日
    浏览(30)
  • Vue源码系列讲解——模板编译篇【五】(优化阶段)

    在前几篇文章中,我们介绍了模板编译流程三大阶段中的第一阶段模板解析阶段,在这一阶段主要做的工作是用解析器将用户所写的模板字符串解析成 AST 抽象语法树,理论上来讲,有了 AST 就可直接进入第三阶段生成 render 函数了。其实不然, Vue 还是很看重性能的,只要有

    2024年02月19日
    浏览(21)
  • C++、STL标准模板库和泛型编程 ——迭代器、 算法、仿函数(侯捷)

    侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! ! 一、C++ 面向对象高级开发 1、C++面向对象高级编程(上) 2、C++面向对象高级编程(下) 二、STL 标准库和泛型编程 1、分配器、序列式容器 2、关联式容器 3、迭代器、 算法、仿函数 4、适配器、补充 三、C++ 设计模式 四、C++ 新标准 五、

    2023年04月25日
    浏览(38)
  • Linux shell编程学习笔记24:函数定义和使用

    *20231113 补充了实例使用for循环来简化代码的内容 为了实现模块化设计和代码重用,很多编程语言支持函数或过程,Linux shell也支持函数定义和调用。 Linux shell中的函数与其它编程语言很多有相似之处,也有自己独特之处。 其中: function是 Shell 中的,专门用来定义函数

    2024年02月05日
    浏览(47)
  • 【C++】模板进阶——非类型模板参数、模板特化、模板分离编译

    模板参数分为类型形参 与 非类型形参 类型形参 :出现在模板参数列表中,跟在class或者typedename之类的参数类型名称。 非类型形参 :用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。 非类型模板参数的优势: 有些容器需要在创建对象

    2024年02月01日
    浏览(34)
  • 【C++干货铺】非类型模板 | 模板特化 | 模板分离编译

    ========================================================================= 个人主页点击直达: 小白不是程序媛 C++系列专栏: C++干货铺 代码仓库: Gitee ========================================================================= 目录 非类型模板参数 模板的特化 什么是模板特化? 函数模板特化 类模板的特化 全

    2024年02月04日
    浏览(40)
  • 【C++初阶(十)】C++模板(进阶) ---非类型模板参数、模板的特化以及模板的分离编译

    本专栏内容为:C++学习专栏,分为初阶和进阶两部分。 通过本专栏的深入学习,你可以了解并掌握C++。 💓博主csdn个人主页:小小unicorn ⏩专栏分类:C++ 🚚代码仓库:小小unicorn的代码仓库🚚 🌹🌹🌹关注我带你学习编程知识 模板参数可分为类型形参和非类型形参。 类型形

    2024年01月18日
    浏览(22)
  • 【C++】模板进阶--非类型模板参数&&模板特化及分离编译

    模板参数分为 类型形参 与 非类型形参 ,其中,类型形参即出现在模板参数列表中,跟在class或者typename之类的参数类型名称,非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用 我们以定义一个静态的数组为例,在没有非

    2023年04月23日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包