📦 归档笔记 — 原创建于 WizNote,仅作归档展示;观点以当年为准,非最新。

C++模板的声明

创建时间2021-12-10最后修改2021-12-10原位置/程序员成长之旅/C++/字数863
目录:程序员成长之旅/C++

C++模板的声明

C++的模板分为两种, 分别是函数模板和类模板

函数模板

模板的声明或定义只能在全局,命名空间或类范围内进行。即不能在局部范围,函数内进行,比如不能在main函数中声明或定义一个模板。

声明


// 函数模板

template <class 形参名, class 形参名, ......> 返回类型 函数名(参数列表)

{

函数体

}

当调用这样的模板函数时类型T就会被被调用时的类型所代替,比如swap(a,b)其中abint 型,这时模板函数swap中的形参T就会被int 所代替,模板函数就变为swap(int &a, int &b)。而当swap(c,d)其中cddouble类型时,模板函数会被替换为swap(double &a, double &b),这样就实现了函数的实现与类型无关的代码。

对于函数模板而言不存在 h(int,int) 这样的调用,不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行,即只能进行 h(2,3) 这样的调用,或者int a, b; h(a,b)

另外, 上文中的class关键字和typename关键字意义相同

下方代码演示和上方相同事情


// 函数模板

template <typename 形参名, typename 形参名, ......> 返回类型 函数名(参数列表)

{

函数体

}

使用


// 创建一个swap函数, 实现对任意类型变量进行交换操作

template <class T> void swsp(T &a, T &b){

// do someting...

}

类模板

类模板对象的创建:比如一个模板类A,则使用类模板创建对象的方法为A<int> m;在类A后面跟上一个**<>尖括号并在里面填上相应的类型,这样的话类A中凡是用到模板形参的地方都会被int** 所代替。当类模板有两个模板形参时创建对象的方法为**A<int, double> m;**类型之间用逗号隔开。

声明

对于类模板,模板形参的类型必须在类名后的尖括号中明确指定。

比如A<2> m;用这种方法把模板形参设置为int是错误的(编译错误:error C2079: 'a' uses undefined class 'A<int> '),类模板形参不存在实参推演的问题。也就是说不能把整型值2推演为int 型传递给模板形参。要把类模板形参调置为int 型必须这样指定A<int> m


template<class  形参名, class 形参名, ......>  class 类名{

函数体

};
在类模板外部定义成员函数的方法声明

当在类外面定义类的成员时template后面的模板形参应与要定义的类的模板形参一致。


template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){

函数体

}

  一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。

使用


template<class T> class A{

public:

T a;

T b;

T hy(T c, T &d);

void m();

};
在类模板外部定义成员函数的方法

template<class T1> T A<T1,T2>::hy(){

// do someting...

}

template<class T1> void A<T1,T2>::m(){

// do someting...

}