一、例子
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"的错误。
可见这段代码编译成功的原因无非是没有对函数体进行编译,这就得说一说函数模板与函数模板的实例化,一个函数模板只有在实例化后才会产生出一个特定的函数, 实例化之前,编译器只会检查函数模板的声明部分,而不会检查函数模板的函数体部分;只有发生了该函数模板的函数调用时(函数模板实例化),编译器才会生成特定实例化的函数代码并且对实例化后的函数体进行语法检查等。
也就是说,我们是不是可以这样理解:函数模板只是一个空壳,在未实例化前,编译器只能看到这个壳子的首部也就是函数模板的声明,在利用这个空壳生成了一个真正的“产品”也就是实例化后产生的实例函数才拥有了能够被编译器看到的函数体部分,进而被编译器进行函数声明和函数体部分的语法检查。