博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
类模版和函数模版需要注意的
阅读量:6870 次
发布时间:2019-06-26

本文共 3026 字,大约阅读时间需要 10 分钟。

函数模版要注意的地方见注释,代码如下:

// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include 
#include
using namespace std;/* * 函数模版的格式为: template
函数名(函数参数); * 模版函数的实现要和声明放在一起,如果不放在一起,在实现的时候要重新声明template
*/template
void add(T a, T b){ T temp = 0; temp = a + b; cout << temp << endl;}template
void sub(T a, T b){ T temp = 0; temp = a-b; cout << temp << endl;}int _tmain(int argc, _TCHAR* argv[]){ int num1 = 1; int num2 = 2; double db1 = 22.33; double db2 = 33.55; add(num1, num2); add(db1, db2); sub(db1, db2); system("pause"); return 0;}

 

// test.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include 
#include
using namespace std;/* * 函数模版的格式为: template
函数名(函数参数); * 模版函数的实现要和声明放在一起 * 如果不放在一起,在实现的时候要重新声明template
* 之所以这样的原因是,编译的过程中编译器遇到template
* 之后,才知道下边的类或者函数是一个特殊的函数模版或者类模版 * */template
void add(T a, T b);template
void sub(T a, T b);int _tmain(int argc, _TCHAR* argv[]){ int num1 = 1; int num2 = 2; double db1 = 22.33; double db2 = 33.55; add(num1, num2); add(db1, db2); sub(db1, db2); system("pause"); return 0;}template
void sub(T a, T b){ T temp = 0; temp = a-b; cout << temp << endl;}template
void add(T a, T b){ T temp = 0; temp = a + b; cout << temp << endl;}

对于类模版,成员函数的声明必须在.h文件中完成,.cpp中不写code。否则编译器会报错:无法解析的外部符号 "public: void __thiscall Student<int,int>::add(int,int)" (),该符号在函数 _wmain 中被引用

另外对于类成员函数的定义要跟随其声明,如果在类外进行函数的定义需要添加模版的声明。见如下程序:

#pragma oncetemplate
class Student{ /*在声明的同时进行定义,在这里可以看出,编译器在编译的时候, 先对成员变量进行编译,然后在编译成员函数*/public: Student(void){m_TNum1 = 0; m_TNum2 = 0; }; void add(T1 t_num1, T2 t_num2); ~Student(void){};public: T1 m_TNum1; T2 m_TNum2;};// 类外进行声明template
void Student
::add(T1 t_num1, T2 t_num2){ T1 temp = 0; temp = t_num1 + t_num2; cout << temp <

 

以下为转载:

转自:  感谢作者

1.类模板与模板类的概念

什么是类模板 一个类模板(也称为类属类或类生成类)允许用户为类定义一种模式,使得类中的某些数据成员、默写成员函数的参数、某些成员函数的返回值,能够取任意类型(包括系统预定义的和用户自定义的)。

  如果一个类中数据成员的数据类型不能确定,或者是某个成员函数的参数或返回值的类型不能确定,就必须将此类声明为模板,它的存在不是代表一个具体的、实际的类,而是代表着一类类。

类模板定义 定义一个类模板,一般有两方面的内容:

A.       首先要定义类,其格式为:

template <class T>

class foo

{

……

}

foo 为类名,在类定义体中,如采用通用数据类型的成员,函数参数的前面需加上T,其中通用类型T可以作为普通成员变量的类型,还可以作为const和static成员变量以及成员函数的参数和返回类型之用。例如:

template<class T>

class Test{

private:

    T n;

    const T i;

    static T cnt;

public:

    Test():i(0){}

    Test(T k);

    ~Test(){}

    void print();

    T operator+(T x);

};

B.       在类定义体外定义成员函数时,若此成员函数中有模板参数存在,则除了需要和一般类的体外定义成员函数一样的定义外,还需在函数体外进行模板声明

例如

template<class T>

void Test<T>::print(){

    std::cout<<"n="<<n<<std::endl;

    std::cout<<"i="<<i<<std::endl;

    std::cout<<"cnt="<<cnt<<std::endl;

 

}

如果函数是以通用类型为返回类型,则要在函数名前的类名后缀上“<T>”。例如:

template<class T>

Test<T>::Test(T k):i(k){n=k;cnt++;}

template<class T>

T Test<T>::operator+(T x){

               return n + x;

               }

C.       在类定义体外初始化const成员和static成员变量的做法和普通类体外初始化const成员和static成员变量的做法基本上是一样的,唯一的区别是需在对模板进行声明,例如

template<class T>

int Test<T>::cnt=0;

template<class T>

Test<T>::Test(T k):i(k){n=k;cnt++;}

你可能感兴趣的文章
分析3000份技术面试数据:这几大指标比你毕业于哪所学校更要紧
查看>>
Linux有问必答:如何检查PDF中使用了哪种字体
查看>>
《Lua游戏AI开发指南》一2.1 新建一个沙箱项目
查看>>
对jquery val 获取input 文本框值进行扩展
查看>>
MySQL (select_paren) union_order_or_limit 行为
查看>>
并发不是并行,它更好!
查看>>
nltk 自己训练模型例子
查看>>
间谍卫星的基础?YOLT——利用卷积神经网络对卫星影像进行多尺度目标检测(Part I)...
查看>>
jstl_开发第一个标签
查看>>
程序员哇,你想在下个情人节或者520脱单么?这个秘籍不能错过
查看>>
去不去O,谁说了算?
查看>>
PHP防SQL注入和XSS攻击
查看>>
在SHAREPOINT共享文档库中启用版本控制功能。
查看>>
Http 代理工具 实战 支持网页与QQ代理
查看>>
又见尾递归
查看>>
安装PyGraphics
查看>>
【COCOS2DX-LUA 脚本开发之四】使用TOLUA++编译PKG,从而创建自定义类让LUA脚本使用...
查看>>
开源大数据周刊-第16期
查看>>
遥感图像分类现状及存在的问题
查看>>
Commons Logging存在的ClassLoader问题详解
查看>>