分享

STL C++编译中的 延迟编译

 GLL_ 2018-06-09
每个函数模板事实上要被编译两次,一次是在实例化之前,先检查函数模板本身,查看语法是否正确。另一次是在实例化期间,结合所使用的参数类型,再次检查模板代码,查看是否所有的调用都有效。但是要注意,只有第二次编译时,才会真正产生二进制形式的机器指令。作为 第一次
编译的结果,仅仅是在编译器内部形成一个用于描述该函数模板 的数据结构,即多为模板内部表示。这种对模板函数编译过程的特出处理被称为延迟编译
​  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 }

经过修改之后没出现错误,说明是对了

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多