C++ 模板函数与模板类

一、模板函数

  函数模板提供了一类函数的抽象,即代表了一类函数。当函数模板被实例化后,它会生成具体的模板函数。例如下面便是一个函数模板:

  

  当实际调用它时,就会生成具体的模板函数:

  

    模板函数在调用过程中会进行数据类型的自动匹配(在不产生歧义的情况下),但如果需要指定类型的话,可以显示声明,如:

  

  这样,函数模板中的T就会被double所代替。

  自动匹配有以下的规则:

    1) 函数实参是否满足模板的实参(此时的判断没有数据类型的转换);

    2) 若不满足1), 函数实参进行数据转换在进行匹配;

    3) 若依旧不满足,则会编译错误。

  例如:我们声明了下面两个函数:

  

  当我们如此调用时:
  

  调用的是第二个max函数,因为第一个无法完成T的匹配,所以就会将字符B转换成整型,把9转成double型,从而调用第二个函数。

二、模板类
  模板类的使用和模板函数相似,只是在具体化模板类时需要显示声明模板实参,例如我们构造了一个模板类stack:

  

  T表示类型,capacity表示初始化时Stack的规定容量。

  当我们在书写类方法时,其格式如下:

  

  每一个类方法之前都要加上一个template的说明,其类名也要加上模板参数,而其在调用的时候格式如下;

  

  如上,我们声明了一个类型为int, 容量为15的Stack,接下来就可以使用类中的各种类方法了。

  //End.

  

  

时间: 2024-11-10 00:07:18

C++ 模板函数与模板类的相关文章

模板函数和模板类的区别

函数模板与类模板的区别 答:函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化 必 须由程序员在程序中显式地指定. 即函数模板允许隐式调用和显式调用而类模板只能显示调用 这期间有涉及到函数模板与模板函数,类模板与模板类的概念 (类似于类与类对象的区 别) 请看下面例子 注意:模板类的函数声明和实现必须都在头文件中完成,不能像普通类那样声明在.h文件中实现在.cpp文件中,原因可以看链接http://hi.baidu.com/cn_rigel/blog/item/6cf6fc

函数模板与模板函数及模板类与模板的特化

函数模板( Function templates) * 模板(Templates)使得我们可以生成通用的函数,这些函数能够接受任意数据类型的参数,可返回任意类型的值,而不需要对所有可能的数据类型进行函数重载.这在一定程度上实现了宏(macro)的作用.它们的原型定义可以是下面两种中的任何一个: template <class identifier> function_declaration; template <typename identifier> function_decla

C++模板函数和模板类的诠释

TemPlate (模板) 一. 函数模板(Function Template) 在C++里,我们可以写一个通用函数,使用非实例化的参数类型,该参数在函数被调用时进行实例化.这种函数称为函数模板. 以前我们实现一个函数的时候都会为其写一个独自的方法去实现,就是把所有的代码都写在main函数里,没有任何封装和模块,这样的程序编写风格不是很好,没有充分的实现代码的复用. eg:int iArray[max] = {10, 20, 30, 40, 50}; float fArray[max] = {1

C++高级 STL——模板函数、模板类

1.模板函数 // 定义 template <class T> Max(T &t1, T &t2) { return ((t1 > t2) ? t1 : t2); } //使用 Max(1, 2); Max(2.2, 3.3); 2.模板类 //定义 template <class T1, class T2> class myClass { private: T1 t1; T2 t2; public: myClass() {} myClass(T1 t1, T

gcc 关于模板函数或者模板类的问题

我把模板的声明写在X.h的文件里,把实现写在X.cpp的文件里 然后编译不通过,然人很恼火的是,根本不知道啥原因 在某网站上看到了一句 “又是一个模板分离编译的受害者” 立马就改正了,于是把两个文件写在了一起 没错了 然后搜了一下“模板分离” 有人说这是个传说 有人说这是真的 我也不深究这是啥了 听人讲这是老版本的编译器的错误 可现在都是2014年了啊 2014年11月25日20:21:59

模板函数

1.函数可以和类一样定义为模板函数. 模板函数与模板类最大的不同是:模板函数可以通过函数的参数确定模板类型. template<class T,int i> T&lookup(string<T> &s,const int n){......} string<float> s; int x=0; lookup(s,x);//这里自动识别到T就是float 类模板不会对参数进行推断的原因是一个类可以提供多个构造函数,在某些时候对模板类的参数进行推断是无法完成

函数模板与模板函数

1.函数指针--指针函数  函数指针的重点是指针.表示的是一个指针,它指向的是一个函数,例子: int   (*pf)(); 指针函数的重点是函数.表示的是一个函数,它的返回值是指针.例子: int*   fun(); 2.数组指针--指针数组  数组指针的重点是指针.表示的是一个指针,它指向的是一个数组,例子: int   (*pa)[8]; 指针数组的重点是数组.表示的是一个数组,它包含的元素是指针.例子; int*   ap[8]; 3.类模板--模板类(class   template-

[转]C++函数模板与模板函数

1.函数模板的声明和模板函数的生成 1.1函数模板的声明 函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计.它的最大特点是把函数使用的数据类型作为参数. 函数模板的声明形式为: template<typename 数据类型参数标识符> <返回类型><函数名>(参数表) {     函数体 } 其中,template是 定义模板函数的关键字:template后面的尖括号不能省略:typename(或class)是声明数据类型参数标识符

聊聊C++模板函数与非模板函数的重载

函数重载在C++中是一个很重要的特性.之所以有了它才有了操作符重载.iostream.函数子.函数适配器.智能指针等非常有用的东西. 平常在实际的应用中多半要么是模板函数与模板函数重载,或者是非模板函数与非模板重载.而让模板函数与非模板函数重载的情况却很少. 前几天在项目中偶然遇到了一个模板函数与非模板函数重载的诡异问题,大概相当于下面这种情况: 1 template <typename T> 2 int compare(const T& lhs, const T& rhs)