1.与普通函数的区别
{
隐式转换必须在参数列标给出类型
1.函数模板与普通函数区别
2.都可以被重载
3.在模板函数和普通函数都可以实现的情况下优先调用普通函数
4.test<>(10); 可以强制调用函数
5.函数模板直接也可以重载,具体使用看最好的匹配
}
include
using namespace std;
template
void test(T A)
{
printf("我是模板函数");
}
template<class T,class M>
void test(T A, M b)
{
printf("我是模板函数2");
}
void test(int c)
{
cout << c << endl;
}
2.函数模板的局限性
无法比较两个类 或者数组 我们只能将模板具体化
include
using namespace std;
/// 动物园案例
template
bool test(T &A,T &z)
{
if (A == z)
{
return true;
}
else
{
return false;
}
}
class to
{
public:
to(int age)
{
this->age = age;
}
int age;
};
template<> bool test
{
printf("函数模板具体化\n");
if (A.age == z.age)
{
return 1;
}
else
{
return 0;
}
}
int main()
{
to t1(20);
to t2(20);
if (test(t1, t2))
{
printf("相等");
}
else
{
printf("不相等");
}
return 0;
}
3.类模板
不会自动推导函数类型,需要在参数列表给出
2.默认类型 给出后所有的类膜拜都要给出
4.复数的模板类
![[$QDM@SGL@FK6)$9@W8A]DOX.jpg]]
运算符实现 符号重载实现
include
include<string.h>
using namespace std;
/// 动物园案例
template<class A,class B>
class mb
{
public:
mb()
{
a = 0;
b = 0;
}
mb(A name, B age)
{
this->a = name;
this->b = age;
}
A a;
B b;
mb mb_add(mb& c2)
{
mb<A, B> c;
c.a = this->a + c2.a;
c.b = this->b + c2.b;
return c;
}
mb operator+(mb& c2)
{
mb<A, B> tep(this->a + c2.a, this->b + c2.b);
return tep;
}
};
int main()
{
mb<int,int> z1(3, 4);
mb<int, int> z2(5, 4);
mb<int, int> z3;
//z3 = z1.mb_add(z2);
z3 = z1 + z2;
printf("%d", z3.a);
return 0;
}
5.类模板做函数参数
//直接指定
void func(to<string, int>& c)
{
}
//参数模板化
template<class A, class B>
void func2(to<A , B >& b)
{
}
//整个类 模板化
template
void func(A& c)
{
}
6.类模板的继承
1.普通类继承模板类
class toto :public to<int, int>
{
//告诉编译器模板类的具体类型
};
int ma
2.类模板继承类模板
7.类模板成员的类内 类外实现
类外 写成函数模板
template<class A, class B>
void to<A, B>::test2(A z, A b)
{
}