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就可以找到所有模板的实例化了。连接也没问题。

  • 相关阅读:
    CSS_行内元素和块级元素
    jdbc连接oracle11g的问题——查不出来数据,权限问题
    新的起点
    MVC过滤器详解
    SQL Server游标的使用
    处理百万级以上的数据提高查询速度的方法
    两个有序数组找出相同数据
    C# 可变参数
    C#反射
    产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。
  • 原文地址:https://www.cnblogs.com/secondtonone1/p/5667603.html
Copyright © 2011-2022 走看看