为了仔细搞清楚模板的实现,在网上找到了一篇介绍文章,出处:http://topic.csdn.net/t/20060629/11/4850102.html

1.函数模版的编译模式分两种:完全包含编译模式和局部编译模式(需要用export关键字)  
  2.不同的编译器对这两种编译模式的支持各不相同,但一般都支持完全包含编译模式,具体支持情况需要参照具体使用的编译器文档   

  
  模版函数和普通函数在使用的时候有一定的区别:  
          (1)普通函数在使用的源文件中直接include该函数的声明即可  
          (2)模版函数在使用的源文件中既要include模版函数的声明,也要include模版函数的定义(因为只有在编译的时候,根据模版函数的定义进行实例化后生成的函数才是真正的函数定义)   

  /////举例说明完全包含编译模式:  
  (1)test.h中在声明的后面include   "test.cpp",这样做的目的是把sum的声明和定义放在两个文件中  
  (2)first.cpp和second.cpp中都用到了sum函数模版,所以都要include   "test.h",所以在两个cpp文件中都有一份sum的定义,所以在实例化以后,存在两个相同的函数定义:int   sum(int   a,int   b){return   a+b;}  
  (3)对于这种重复定义的问题,完全包含编译模式下,编译器自己会去除冗余的函数定义,而只保留一个int   sum(int   a,int   b)函数的定义  
  (4)所以这种编译模式下,编译效率会降低(因为如果100的cpp文件中都调用了sum(2,3),那么会存在100个int   sum(int   a,int   b)函数的定义,去除其余99个冗余定义的操作会占用大量的编译时间)  
   
   
  test.h头文件的内容:  
  template<typename   Type>  
  Type   sum(Type   a,Type   b);//函数模版的声明  
   
  #include   "test.cpp"  
   
  test.cpp文件的内容:  
  template<typename   Type>  
  Type   sum(Type   a,Type   b)  
  {  
          return   a+b;  
  }//函数模版的定义  
   
  first.cpp文件的内容:  
  #include   "test.h"  
  int   main()  
  {  
          sum(2,3);  
          return   0;  
  }  
   
  second.cpp文件的内容:  
  #include   "test.h"  
  int   second()  
  {  
          sum(2,3);  
          return   0;  
  }  
   
   
  所以为了避免完全编译模式的这种低效率,出现了局部编译模式  
   
   
  ///////举例说明局部编译模式  
  (1)test.h头文件中不需要再include   "test.cpp"  
  (2)需要使用sum的cpp文件中只需要include   "test.h"即可  
  (3)在实例化sum函数时,编译器会自动跟踪到sum函数模版的定义(通过export关键字)  
  (4)这样就提高了编译速度  
   
  test.h头文件的内容:  
  template<typename   Type>  
  Type   sum(Type   a,Type   b);//函数模版的声明  
   
  //#include   "test.cpp"//不需要包含sum函数的定义  
   
  test.cpp文件的内容:  
  export   template<typename   Type>//前面加上export关键字  
  Type   sum(Type   a,Type   b)  
  {  
          return   a+b;  
  }//函数模版的定义  
   
  first.cpp文件的内容:  
  #include   "test.h"  
  int   main()  
  {  
          sum(2,3);  
          return   0;  
  }  
   
  second.cpp文件的内容:  
  #include   "test.h"  
  int   second()  
  {  
          sum(2,3);  
          return   0;  
  }   
  综上所述:export关键字只有在使用局部编译模式时才会用到,同时需要编译器支持局部编译模式,如果编译器不支持这种编译模式,那么不能使用export

posted on 2009-10-26 14:07  伴我闯天涯  阅读(198)  评论(0编辑  收藏  举报