1.可以为类的成员函数创建模板,但不可以是虚函数和析构函数。
#include <iostream>
using namespace std;
class CGirl {
public:
template <typename T>
CGirl(T a) {//构造函数中
cout << "a=" << a << endl;
}
template <typename T>
void show(T b) {//普通成员函数
cout << b << endl;
}
};
int main() {
CGirl g(5);
g.show(90);
return 0;
}
以上很合理,可以对构造函数,和普通成员函数创建模板,但是虚函数不可以:如下
构造函数和普通的成员函数都可以用函数模板,但是你这个虚函数就不行了。
2.使用函数模板的时候必须明确数据类型,确保实参与函数模板能匹配上。
你让他没法推导也不行,这样的话你就制定一个数据类型int得了
——————————————————————————————————————————
3.使用函数模板时,推导的数据类型必须适应函数模板中的代码。
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
class CGirl
{
};
int main() {
int a = 10;
int b = 20;
int c = add(a, b); cout << "c = "<<c << endl;
string d = "zhuge";
string e= "ouge";
string f = add(d, e); cout << "f = " << f << endl;
//CGirl x, y;
//CGirl z = add(x, y);
return 0;
}
c = 30
f = zhugeouge
C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 19920)已退出,代码为 0。
按任意键关闭此窗口. . .
int string 都适用这个函数模板的代码;
但是CGirl不适用于加法;
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
class CGirl
{
};
int main() {
CGirl x, y;
CGirl z = add(x, y);
return 0;
}
4.使用函数模板时,如果是自动类型推导,不会发生隐式类型转换,如果显示指定了函数模板的数据类型,可以发生隐式类型转换;
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
class CGirl
{
};
int main() {
int a = 10;
int b = 20;
int c = add(a, b);
cout << "c = " << c << endl;
return 0;
}
还是刚才的代码,你这么整没毛病,他是与函数模板的定义匹配的;如果把变量b改为char,则报错,due to 模板参数不明确;
看来编译器也是没有对b进行隐式类型转换,如果显式指定函数模板的数据类型为 int:
就可以了;
也就是说:如果显式指定了函数模板的数据类型,编译器就可以对实参进行隐式类型转换。
5.函数模板支持多个通用数据类型的参数;(实际开发不常用,但是必须掌握)
#include <iostream>
using namespace std;
template <typename T1,typename T2>
void show(T1 no, T2 message) {
cout << "亲爱的" << no << "号:" << message << endl;
}
int main() {
short bh = 3;//超女编号
const char* message = "我是一只傻傻鸟。";//表白内容
show(bh,message);
return 0;
}
亲爱的3号:我是一只傻傻鸟。
C:\Users\代伟业\Desktop\C++\初始化列表\this指针\x64\Debug\this指针.exe (进程 4236)已退出,代码为 0。
按任意键关闭此窗口. . .
他是自动推导的:
6.函数模板支持重载,可以有非通用数据类型的参数;
#include <iostream>
using namespace std;
template <typename T>
void func(T a) {
cout << "func(T a)\n";
}
template <typename T1,typename T2>
void func(T1 a, T2 b) {
cout << "func(T1 a,T2 b)\n";
}
template <typename T1,typename T2>
void func(T1 a, T2 b, int c) {
cout << "func(T1 a,T2 b,int c)\n";
}
int main() {
func(1);
func(1, 2);
func(1, 2, 3);
return 0;
}