-> 在类声明前使用template进行标识。
-> 用于说明类中使用的泛指类型T。
代码示例:类模板
template < typename T >
class Operator
{
public:
T op(T a, T b);
};
类模板注意点:
-> 只能显示指定具体类型,无法自动推导。
-> 使用具体类型定义对象。
Operator<int> op1;
Operator<string> op2;
int i = op1.op(1,2);
string s = op2.op("D.T.","Software");
-> 声明的泛指类型T可以出现在类模板的任意地方。
-> 会从类模板通过具体类型产生不同的类。
-> 在声明的地方对类模板代码本身进行编译。
-> 在使用的地方对参数替换后的代码进行编译。
代码示例:类模板初探
#include <iostream>
#include <string>
using namespace std;
//第一次对类模板进行编译
template < typename T >
class Operator
{
public:
T add(T a, T b)
{
return a + b;
}
T minus(T a, T b)
{
return a - b;
}
T multiply(T a, T b)
{
return a * b;
}
T divide(T a, T b)
{
return a / b;
}
};
int main()
{
//第二次在使用的地方进行编译
Operator<int> op1;
cout << op1.add(1, 2) << endl;
//第二次首先编译这里构造函数
Operator<string> op2;
//第二次编译针对add函数(第二次编译也是分阶段编译,理解不冲突)
cout << op2.add("D.T.", "Software") << endl;
//第二次针对minus编译时,发现字符串没有相减操作,编译器报错!!有了添加的重载字符串减法函数,编译器匹配
cout << op2.minus("D.T", "Software") << endl; //两个字符串不能相减
return 0;
}
结果:类模板可以重载,但是两个字符串不能相减。
58-1.cpp: In instantiation of ‘T Operator<T>::minus(T, T) [with T = std::basic_string<char>]’:
58-1.cpp:46:38: required from here
58-1.cpp:17:12: error: no match for ‘operator-’ (operand types are ‘std::basic_string<char>’ and ‘std::basic_string<char>’)
return a - b;
58-1.cpp:在实例化'T Operator<T>::minus(T, T) :
58-1.cpp:17:12: error: 没有匹配'operator-'
解决办法:添加一个“-”减号,操作符重载。
#include <iostream>
#include <string>
using namespace std;
//第一次对类模板进行编译
template < typename T >
class Operator
{
public:
T add(T a, T b)
{
return a + b;
}
T minus(T a, T b)
{
return a - b;
}
T multiply(T a, T b)
{
return a * b;
}
T divide(T a, T b)
{
return a / b;
}
};
//有这个函数编译器不报错
string operator-(string& l, string& r) //重载字符串相减,为了解决编译第二阶段错误
{
return "Minus"; //不为了实现功能
}
int main()
{
//第二次在使用的地方进行编译
Operator<int> op1;
cout << op1.add(1, 2) << endl;
//第二次首先编译这里构造函数
Operator<string> op2;
//第二次编译针对add函数(第二次编译也是分阶段编译,理解不冲突)
cout << op2.add("D.T.", "Software") << endl;
//第二次针对minus编译时,发现字符串没有相减操作,编译器报错!!有了添加的重载字符串减法函数,编译器匹配
cout << op2.minus("D.T", "Software") << endl; //两个字符串不能相减
return 0;
}
结果:
3
D.T.Software
Minus
2.类模板的工程应用
-> 类模板必须在头文件中定义。
-> 类模板不能分开实现在不同的文件中。
-> 类模板外部定义的成员函数需要加上模板<>声明。
代码示例:
Operator.h:
#ifndef _OPERATOR_H_
#define _OPERATOR_H_
template < typename T >
class Operator
{
public:
## 最后
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。**
**因此收集整理了一份《2024年嵌入式&物联网开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**







**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.youkuaiyun.com/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!
*既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上嵌入式&物联网开发知识点,真正体系化!**
[**如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.youkuaiyun.com/topics/618654289)
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**!!