模板类简单实例
先看代码
1.主程序(.cpp)
#include "Params.h"
#include <iostream>
using namespace std;
int main()
{
int a = 666;
std::string str = "123123";
Params<int, std::string> pms;
pms.Hello(a, str);
return 0;
}
- 模板类
Params.h
#pragma once
#include <iostream>
template<typename T1, typename T2>
class Params
{
public:
void Hello(T1 a, T2 b);
};
Params.cpp
#include "Params.h"
#include <iostream>
template<typename T1, typename T2>
void Params<T1, T2>::Hello(T1 a, T2 b)
{
std::cout << a << " " << b << std::endl;
}
重点总结
1.模板类中的.h、.cpp两个文件不能像普通的类一样分成两个文件,需要将.cpp中的内容放到.h中实现,具体原因可百度查看,这里摘取一段:通俗地说,用户写一个模板定义,模板本身提供任何数据类型的支持,而编译器在编译出的目标文件中只支持确定的类型例如func(int,int),func(string char),而不能支持func(模板类,模板类...)(注意模板是C++的特性而非编译器的特性)。那么编译器在编译的时候根本不知道用户要传入什么样的参数,所以无法确定模板的实例,所以编译器只能等到用户使用此模板的时候才能进行实例化,才能确定模板的具体类型,从而为其分配内存空间,像上述例子中,模板没有实例化,编译器也就不会为模板分配内存空间。
2.主程序引用模板类,实例化时不能像普通类一样写
Params pms;
需要指定模板类中使用的两个虚拟类的具体类型
Params<int, std::string> pms;
3.实现模板类中函数时,需要在函数前面添加模板声明
template<typename T1, typename T2>
改善
最后模板类只需要一个.h文件
#pragma once
#include <iostream>
template<typename T1, typename T2>
class Params
{
public:
void Hello(T1 a, T2 b);
};
template<typename T1, typename T2>//必加
void Params<T1,T2>::Hello(T1 a, T2 b)
{
std::cout << a << " " << b << std::endl;
}
执行结果