模板基于源码的替换而不是基于obj的复用

本文深入探讨了C++中模板的概念及其实现机制,包括函数模板和类模板的实例化过程,以及实例化时机的选择。此外,还通过示例说明了不同文件间如何正确地使用模板实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模板提供了代码复用。在使用模板时首先要实例化,即生成一个具体的函数或类。函数模板的实例化是隐式实现的,即由编译系统根据对具体模板函数(实例化后的函数)的调用来进行相应的实例化,而类模板的实例化是显式进行的,在创建对象时由程序指定。   
一个模板有很多实例,是否实例化模板的某个实例由使用点来决定,如果未使用到一个模板的某个实例,则编译系统不会生成相应实例的代码。   
在C++中,由于模块是分别编译的,如果在模块A中要使用模块B中定义的一个模板的某个实例,而在模块B中未使用这个实例,则模块A无法使用这个实例,除非在模块A中也定义了相应的模板。因此模板是基于源代码复用,而不是目标代码复用。   
例:   
  //   file1.h   
  template   <class   T>   
  class   S   
  {     T   a;   
      public:   
        void   f();   
  };   

  //   file1.cpp   
  #include   "file1.h"   
  template   <class   T>   
  void   S<T>::f()   
  {   …   
  }   
    
  template   <class   T>   
  T   max(T   x,   T   y)   
  {   return   x>y?x:y;   
  }   
    
  void   main()   
  {   int   a,b;   
      float   m,n;   
      max(a,b);   
      max(m,n);   
      S<int>   x;   
      x.f();   
  }   
    
  //   file2.cpp   
  #include   "file1.h"   
  extern   double   max(double,double);   
    
  void   sub()   
  {   max(1.1,2.2);   //Error,no   appropriate   instance   
      S<float>   x;   
      x.f();   //Error,   corresponding   instance   has   no   appropriate   implementation   
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值