zoukankan      html  css  js  c++  java
  • c++模板使用及实现模板声明定义的分离

    c++模板是编译器构造具体实例类型的模型,使类型参数化,是泛型编程的基础,泛型就是独立于特定类型。

    一、模板分为函数模板和类模板两种。

      函数模板:template <class 形参名,class 形参名,......>   返回值  函数名(参数列表...){}

      类模板:template  <class 形参名,class 形参名,......>  class  类名{ };

    如上是实现函数模板和类模板的方法。在使用时,模板函数和普通函数一致,c++采用参数推导的方式自动生成与传入实参一致的函数实例。类模板在使用时,需要对类型参数赋值,如:

      Templateclass<类型实参> TempClass;

    编译器由此生成传入实参对应的实例类。

    注意模板实例化发生在编译阶段,大量使用模板的一个弊端就是造成大量代码生成,使编译变慢。

    二、模板的另一个特点是,模板类的声明和实现不能分离,即都在.h文件中。有两中方式实现模板声明和实现的分离。

    1、使用.hpp的方式。将模板实现放在.hpp中,并在.h文件最后中加入.hpp的声明。

    2、使用显式的模板实例声明,如:

    //template.h
    #ifndef TEMPLATE_H_
    #define TEMPLATE_H_
    
    #include <iostream>
    
    //#include 
    template <typename T>
    class TemplateDemo{
        public:
            TemplateDemo(T & data, int size);    
        private:
            T *_data;
        protected:    
    };
    
    #endif //TEMPLATE_H_
    
    //template.cpp
    #include "template.h"
    
    template <typename T>
    TemplateDemo<T>::TemplateDemo(T & data, int size){
        if( size != 0){
            this->_data = new T[size];
            for(int i = 0; i < size; i++){
                this->_data[i] = data;
            }
        }
    }
    
    template class TemplateDemo<std::string>;
    template class TemplateDemo<int>;

    三、为什么模板类不能够声明和定义分离?

    模板类是编译器生成具体的类的依据,只有模板被使用时才会编译。首先一般编译器都是以一个.cpp文件为一个编译单元,如果模板类的声明和实现是分离的,那么对模板类的定义文件编译,生成.o文件,此时只有模板,没有模板的实例类。c++编译器的工作流程分为预处理、编译、汇编、链接,而模板实例化发生在编译期间,当编译器没有找到模板类的一个特例时,它会认为该特例在另外的文件中(.o或.so),而将问题交给链接器去处理,但是模板的实现文件中没有该实例,无法找到符号,所以一般这种问题的抱错都是”ld error“。

    那么为什么模板不被使用就无法编译呢。我们知道,c语言对内存的管理是底层的面向系统的,如果类型参数化的模板类而言,无法得知模板的类型,就无法得知模板类的占用内存。编译器无法为一个不知道大小的类分配内存。所谓模板类,不是一个类,而是一个生成类的模板。

  • 相关阅读:
    myeclipse 自动部署web项目(自动编译)
    A股、B股区别
    vi分屏指令
    并发用户数与TPS之间的关系
    单台机器安装zookeeper
    Flask-sqlalchemy使用alembic迁移模型_示例1
    Excel VBA 判断是否打开了某个Excel文件
    Excel VBA 从一个带文件夹名和文件名的字符串里提取文件夹名和文件名
    混合编程 从Excel VBA里调用Python模块文件
    Excel VBA 如何在工作表上使用Option Button按钮
  • 原文地址:https://www.cnblogs.com/xiangleili/p/8867616.html
Copyright © 2011-2022 走看看