一、function template:
template<class T>
void swap (T& x, T& y)
void foo(void)
foo<int>(); √
foo<float>(); √
在swap中可以使用T来代替数据类型,在实际使用的时候T可以是任意数据类型
T可以用来做参数的类型,也可以做返回值类型,也可以用来做变量的声明
template是一个declaration
编译时不对template做任何操作,只是记录
在运行时,在调用函数出使用template创造一个新的函数
使用template中没有类型转换。如果函数中涉及template的地方需要进行自动类型转换会报error
函数重载overload规则:
1.检查唯一函数匹配
2.检查唯一函数模板匹配
二、class template
template <class T>
class vector{.....}
vector<int> v1(100);
vector<complex> v2(256)
类的成员函数,每一个函数都是函数模板(function template)
都要写成如下格式:
template <class T>
vector<T>::f (...) {...}
template function
template class
----------------------------------------------------------------------------------------------------------
template会导致编译时多遍扫描
template中可以有多个参数
template<class Key, class Value>
注意template的尖括号,前后加空格以防与其他符号相连形成其他符号(如>>)
在实际应用中尖括号的里的内容可能会相当复杂
Vector< int (*)(Vector<double>&, int)>
------------------------------------------------------------------------------------------------------------
template的参数列表除了可以包含类,还可以包含常数表达式
template <class T, int bounds = 100> 其中100为参数默认值
class FixedVector{......};
---------------------------------------------------------------------------------------------------------
FixedVector<int, 50> vl;
FixedVector<int, 10*5> v2;
FixedVector<int> v3; // uses default
---------------------------------------------------------------------------------------------------------
文件中声明了一个class template
在实际应用中可能在多个cpp文件中生成相同的class of sometype(而且会同名)
在链接时会出现问题:调用时不知道应该链接哪一个
解决方法:
1.在名字前加上文件的前缀