zoukankan      html  css  js  c++  java
  • C++模板类注意事项

    最近使用C++模板,虽然工作几年了,但是模板用的很少,确切的说自己实现的机会很小。

    昨天写了一个代码maxheap.h 中实现了类模板的声明,我将实现写在maxheap.cpp中,

    当在main.cpp中引用maxheap中的接口时,提示链接错误。网上提供了几个解决方案,

    第一种方式是将maxheap.h和maxheap.cpp包含在某个.h文件中,这样在main函数中

    包含这个.h即可。第二种方式叫分离模式,我没看,觉得没必要搞得那么复杂。第三种方式

    是我最看好的方式,就是将模板类的实现也放在.h中。C++ stl模板就是在.h中实现的。

    C++编译文件将.cpp编译为.o文件,在链接阶段将.o文件链接生成可执行文件。问题

    就出现在模板实现的.cpp文件并不在编译时实例化,读者可以试着在模板实现的.cpp里

    写一些错误的代码,编译器并没有监测到,因为模板实现的cpp没有参与编译。他需要在特定类型

    绑定后才会实例化,是延时的。

    编译器使用模板,通过更换模板参数来创建数据类型。这个过程就是模板实例化(Instantiation)。
      从模板类创建得到的类型称之为特例(specialization)。 
      模板实例化取决于编译器能够找到可用代码来创建特例(称之为实例化要素,
      point of instantiation)。
      要创建特例,编译器不但要看到模板的声明,还要看到模板的定义。
      模板实例化过程是迟钝的,即只能用函数的定义来实现实例化。

    所以将类模板的实现文件放在.h里,main函数包含该.h文件,当main函数用到该模板的特例化时

    通过该.h就可以找到所有模板的实例化了。连接也没问题。

  • 相关阅读:
    webform文件上传加水印
    2017-6-6 ASP.NET Ajax版页面无刷新三级联动
    2017-6-5 Ajax应用
    转【 正则表达式】
    2017-6-4 JQuery中的选择器和动画 弹窗遮罩
    Linq 组合分页查询
    2017-6-2 Linq高级查询和函数
    2017-6-3 JQuery中的Dom操作和事件
    WebForm母版页
    WebForm内置对象:Application和ViewState、Repeater的Command用法
  • 原文地址:https://www.cnblogs.com/secondtonone1/p/5667603.html
Copyright © 2011-2022 走看看