《关于模板类实例化.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《关于模板类实例化

模板函数在声明的时候, 其实并不存在,函数地址也就无从谈起了,而导出到动态链接库的函数都需要有地址 (动态链接库不能将模板类导出,因为没法生成实例) 如果把模板类的声明和定义都放在头文件中。需要用到模板类的时候,只需要包含该头文件,然后进行实例化。 如果模板类的声明和定义分别放在头文件和源文件中。当实例化的时候,只包含头文件会发证链接错误。 原因是模板类的实例化要分成两个步骤,模板的特例化和特例的实力化。 编译器在编译阶段,由于没有定义,所以编译器不能生成具体的模板特例,但是这并不会报错误,编译器将把问题抛给链接器来做。在编译源文件的时候,程序找不到该模板的特例,只是有模板而已,所以无法生成对象。所以会发生错误。 以下转自牛人blog ================= 前言   常遇到询问使用模板到底是否容易的问题,我的回答是:“模板的使用是容易的,但组织编写却不容易”。看看我们几乎每天都能遇到的模板类吧,如STL, ATL, WTL, 以及Boost的模板类,都能体会到这样的滋味:接口简单,操作复杂。   本文对象是那些熟悉模板但还没有很多编写模板经验的程序员。本文只涉及模板类,未涉及模板函数。但论述的原则对于二者是一样的。   问题的产生   通过下例来说明问题。例如在array.h文件中有模板类array:   // array.h   template typename T, int SIZE   class array   {   T data_[SIZE];   array (const array other);   const array operator = (const array other);   public:   array(){};   T operator[](int i) {return data_[i];}   const T get_elem (int i) const {return data_[i];}   void set_elem(int i, const T value) {data_[i] = value;}   operator T*() {return data_;}   };   然后在main.cpp文件中的主函数中使用上述模板:   // main.cpp   #include array.h   int main(void)   {   arrayint, 50 intArray;   intArray.set_elem(0, 2);   int firstElem = intArray.get_elem(0);   int* begin = intArray;   }   这时编译和运行都是正常的。程序先创建一个含有50个整数的数组,然后设置数组的第一个元素值为2,再读取第一个元素值,最后将指针指向数组起点。   但如果用传统编程方式来编写会发生什么事呢?我们来看看:   将array.h文件分裂成为array.h和array.cpp二个文件(main.cpp保持不变)   // array.h   template typename T, int SIZE   class array   {   T data_[SIZE];   array (const array other);   const array operator = (const array other);   public:   array(){};   T operator[](int i);   const T get_elem (int i) const;   void set_elem(int i, const T value);   operator T*();   };  // array.cpp   #include array.h   templatetypename T, int SIZE T arrayT, SIZE::operator [](int i)   {   return data_[i];   }   templatetypename T, int SIZE const T arrayT, SIZE::get_elem(int i) const   {   return data_[i];   }   templatetypename T, int SIZE void arrayT, SIZE::set_elem(int i, const T value)   {   data_[i] = value;   }   templatetypename T, int SIZE arrayT, SIZE::operator T*()   {   return data

文档评论(0)

1983xuesheng + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档