编译整体过程(针对C/C++),
1. 预处理:包含宏替换,条件编译,include导入文件
2. 编译: 包含词法分析,语法分析,语义分析,中间代码生成与优化,生成汇编文件
3. 汇编: 将汇编文件编译成2进制的机器码
4. 链接: 将目标文件与外部符号进行链接,得到一个二进制可执行文件
当编译器遇到一个模板定义时,它并不生成代码。只有我们实例化出模板的一个特定版本时,编译器才会生成代码。
一般情况,当我们调用一个函数时,编译器只需要掌握函数的声明。当我们使用一个类类型的对象时,类的定义必须可用,但是成员函数的定义不一定已经出现。因此,我们把类的定义和函数声明放在头文件,普通函数和类的成员函数放在源文件中。
但是对于模板来说,为了生成一个实例化版本,编译器需要掌握函数模板或类模板成员函数的定义,因此,我们也将模板的定义放在头文件里面。
模板编译错误时机
模板由于在实例化时才生成代码,所以这会影响其编译错误的时机。
一般来说分为三个阶段,
第一, 编译模板本身,这里主要是语法错误&#