zoukankan      html  css  js  c++  java
  • 一个例子理解c++函数模板的编译

    一、例子

    template <typename T>
    inline void callWithMax(const T& a, const T& b){
        f(a > b ? a : b);
    }
    int main(){
        return 0;    
    }

    二、理解

      关于函数模板的编译以及函数模板的实例化从这个例子可以得到解答。

      单纯编译上述代码不会产生编译错误,但是明显在callWithMax这个函数模板的函数体中调用了一个没有声明的函数f, 如果callWithMax是一个普通函数, 那么这段代码一定会报一个"error: 'f' is not declared in this scope"的错误。

      可见这段代码编译成功的原因无非是没有对函数体进行编译,这就得说一说函数模板与函数模板的实例化,一个函数模板只有在实例化后才会产生出一个特定的函数, 实例化之前,编译器只会检查函数模板的声明部分,而不会检查函数模板的函数体部分;只有发生了该函数模板的函数调用时(函数模板实例化),编译器才会生成特定实例化的函数代码并且对实例化后的函数体进行语法检查等。

      也就是说,我们是不是可以这样理解:函数模板只是一个空壳,在未实例化前,编译器只能看到这个壳子的首部也就是函数模板的声明,在利用这个空壳生成了一个真正的“产品”也就是实例化后产生的实例函数才拥有了能够被编译器看到的函数体部分,进而被编译器进行函数声明和函数体部分的语法检查。

  • 相关阅读:
    setTimeout()和setInterval()的区别
    iOS开发小技巧
    iOS应用跳转到App Store评分
    前端小技巧-定位的活学活用之仿淘宝列表
    前端CSS
    用c# 开发html5的尝试,试用bridge.net
    Faster数据库研习,一
    五一劳动节,讲讲NEO智能合约的调试
    NEO GUI 多方签名使用
    NEO智能合约开发(二)再续不可能的任务
  • 原文地址:https://www.cnblogs.com/GuoYuying/p/13291879.html
Copyright © 2011-2022 走看看