在C++中,我们通常将声明放在.h头文件中,将具体的实现代码放在.cpp文件中。但是函数模板通常不这么做,函数模板是将其声明和实现都放在.hpp文件中。hpp是Header Plus Plus的缩写,是专门存放模板文件的格式。可能有人会问,为什么要将函数模板的声明和实现放在一个头文件中?这是因为当编译器读到函数模板的实现时,因为没有具体的模板参数,所以还不能为它创建一个函数实例,只有当使用这个函数模板的时候,才会为它创建一个具体的函数实例;所以,对于编译器而言,函数模板的实现其实也是一种声明,是声明如何构建一个模板函数的方法。

在前面的几章中,我们都是将函数模板和主函数放到了一个cpp文件中,但是在实际的工作中,都是将函数模板和主函数相分离的。今天,我们就使用HPP文件来实现函数模板和主函数相分离的目标。

例1 使用HPP文件实现模块化编程

Add.hpp文件

#ifndef _ADD_HPP_
#define _ADD_HPP_
template<typename T>
T Add(T t1, T t2)
{
return t1 + t2;
}
#endif

主文件

#include<iostream>
#include "Add.hpp"
using namespace std;
void main()
{
int nRet = Add<int>(1,2);
cout << "和:" << nRet << endl;
}

运行效果如图1所示:

aaarticlea/png;base64,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" alt="" />

图1 使用HPP文件实现模块化编程

例1中,我们首先在Add.hpp文件中创建了一个函数模板Add.hpp,之后在主文件中使用include包含Add.hpp文件,这样就可以实现函数模板和主函数的分离效果了,也就是所谓的模块化编程思想。

今天我们主要讲述了函数模板的载体和在实际的工作中,如何将函数模板和主函数分离的方法,从而实现模块化编程的目标。大家可以回去实践一下,加深体会。

函数模板的载体-HPP的更多相关文章

  1. C++函数模板&类模板

    函数模板 模板概念及语法 主要目的,简化代码,减少重复代码.基本语法格式:  template<class T> 或者 template<typename T> //末尾不加分 ...

  2. C++函数模板详解(一):概念和特性

    函数模板是指这样的一类函数:可以用多种不同数据类型的参数进行调用,代表了一个函数家族.它的外表和普通的函数很相似,唯一的区别就是:函数中的有些元素是未确定的,这些元素将在使用的时候才被实例化.先来看一 ...

  3. C++ Templates (1.5 重载函数模板 Overloading Function Templates)

    返回完整目录 目录 1.5 重载函数模板 Overloading Function Templates 1.5 重载函数模板 Overloading Function Templates 和普通函数一 ...

  4. C++ Templates (1.1 初窥函数模板 A First Look at Function Templates)

    返回完整目录 目录 1.1 初窥函数模板 A First Look at Function Templates 1.1.1 定义模板 Defining the Template 1.1.2 使用模板 ...

  5. c++11-17 模板核心知识(一)—— 函数模板

    1.1 定义函数模板 1.2 使用函数模板 1.3 两阶段翻译 Two-Phase Translation 1.3.1 模板的编译和链接问题 1.4 多模板参数 1.4.1 引入额外模板参数作为返回值 ...

  6. C++进阶-1-模板基础(函数模板、类模板)

    C++进阶 模板 1.1 函数模板 1 #include<iostream> 2 using namespace std; 3 4 // 模板 5 6 // 模板的简单实例 7 // 要求 ...

  7. c++函数模板作为类的成员函数,编译报错LNK2019的解决方法

    为了使某个类的成员函数能对不同的参数进行相同的处理,需要用到函数模板,即template<typename T> void Function(). 编译时报错LNK2019 解决方法: 1 ...

  8. C++STL - 函数模板

    模板主要是为了泛型编程,做到与类型无关 模板有函数模板和类模板,本文主要整理的是函数模板 1.函数模板定义 template<typename 类型形参1,typename 类型形参2,...& ...

  9. 使用getopt_long来解析参数的小函数模板

    getopt_long原型 #define no_argument 0 #define required_argument 1 #define optional_argument 2 struct o ...

随机推荐

  1. Ext4报错Uncaught Ext.Loader is not enabled

    提示: Uncaught Ext.Loader is not enabled, so dependencies cannot be resolved dynamically. Missing requ ...

  2. 【图解ASP.NET MVC运行机制理解-简易版】

    很多盆友咨询ASP.NET MVC的机制.网上也有好多.但是都是相当深奥.看的云里雾里的.我今天抽空,整理个简易版本.把处理流程走一遍. 当然,这个只是处理请求的一部分环节.百度的面试题“客户端从浏览 ...

  3. ./configure : /bin/sh^M : bad interpreter

    用命令行来编译Qt的时候发生标题尚的错误. 原因是文件中带有DOS行结束符,必须把它转换成UNix结束符 references: http://stackoverflow.com/questions/ ...

  4. 中国版 Ubuntu Kylin 14.04 LTS 麒麟操作系统中文版发布下载 (Ubuntu天朝定制版)

    中国版 Ubuntu Kylin 14.04 LTS 麒麟操作系统中文版发布下载 (Ubuntu天朝定制版) http://www.iplaysoft.com/ubuntukylin.html

  5. Unique Paths 解答

    Question A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram be ...

  6. (step6.1.3)hdu 1875(畅通工程再续——最小生成树)

    题目大意:本题是中文题,可以直接在OJ上看 解题思路:最小生成树 1)本题的关键在于把二维的点转化成一维的点 for (i = 0; i < n; ++i) { scanf("%d%d ...

  7. [转]ActiveMQ 即时通讯服务 浅析

    一. 概述与介绍 ActiveMQ 是Apache出品,最流行的.功能强大的即时通讯和集成模式的开源服务器.ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provide ...

  8. Python 列表生成式、生成器、迭代器

    列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 如果要生成[1x1, 2x2, 3x3, ..., 10x10]怎么 ...

  9. 安装Oracle11后在SQL Developer启动时提示:enter the full pathname for the java.exe

    1) Open the file ..\sqldeveloper\sqldeveloper\bin\sqldeveloper.conf and add the following line to se ...

  10. 4. Linux 系统目录

    一.Linux 系统目录的作用 /home            用户主目录的根节点,所有用户自己独有的文件一般放在这个目录下的用户目录下 /bin                二进制可执行命令 / ...