每个函数模板事实上要被编译两次,一次是在实例化之前,先检查函数模板本身,查看语法是否正确。另一次是在实例化期间,结合所使用的参数类型,再次检查模板代码,查看是否所有的调用都有效。但是要注意,只有第二次编译时,才会真正产生二进制形式的机器指令。作为 第一次 编译的结果,仅仅是在编译器内部形成一个用于描述该函数模板 的数据结构,即多为模板内部表示。这种对模板函数编译过程的特出处理被称为延迟编译 1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 typedef unsigned int uint; 7 class B{ //嵌套类 8 9 10 }; 11 12 }; 13 template<typename T> //类型参数 14 void foo(void){ 15 /*typename*/ T::uint u; //类型名 16 /*typename*/ T::B b; 17 18 } 19 int main(void){ 20 A::uint u; 21 A::B b; 22 return 0; 23 } 报错 typename.cpp: 在函数'void foo()’中: typename.cpp:15:18: 错误: 'T:: uint’之前需要'typename’,因为'T’是一个有依赖的作用域 typename.cpp:15:26: 错误: expected ';’ before 'u’ typename.cpp:16:18: 错误: 'T:: B’之前需要'typename’,因为'T’是一个有依赖的作用域 typename.cpp:16:23: 错误: expected ';’ before 'b’ tarena@ubuntu:~/stl/day01$ 1 #include <iostream> 2 using namespace std; 3 4 class A{ 5 public: 6 typedef unsigned int uint; 7 class B{ //嵌套类 8 9 10 }; 11 12 }; 13 template<typename T> //这里的typename是说明类型参数 14 void foo(void){ 15 typename T::uint u; //这里的typename是说明类型名 16 typename T::B b; 17 18 } 19 int main(void){ 20 A::uint u; 21 A::B b; 22 return 0; 23 } 经过修改之后没出现错误,说明是对了 |
|