模板笔记007 - 声明 形参 实参
声明
类模板和函数模板是c++的两种基本类型的模板
模板的声明需要引入一个参数化子句:template <...>
联合模板也是类模板的一种
和普通的函数一样,模板函数也可以有缺省参数
template <typename T>
void func1(Stack<T> const&, int max =10)
{}
template <typename T>
void func2(Array<T>*, T const& = T的默认构造 ) // 只是为了语法高亮,后一个参数是 T const& = T()
{}
对于基本类型,T()为0
参数化除了用在两种基本类型的模板之外,还可以用于一下三种声明:
- 类模板成员函数的定义
- 类模板嵌套类成员的定义
- 类模板的静态数据成员的定义
需要注意的是上面3种特殊的情况都不是模板
template <int I>
class A
{
void open();
class B;
static int num;
};
template <int I>
void A<I>::open()
{}
template <int I>
class A<I>::B
{};
template <int I>
int A<I>::num = 0;
上面这3种情况,都不是使用自身的模板,而是使用外围类模板,参数也是由外围类模板决定
书上并不建议我们称她们为模板
虚函数
成员函数模板不能称为虚函数,相反,类模板的普通成员函数可以成为虚函数
- 每个模板都有一个名字,且在所属作用域下是唯一的
int a;
class a; // ok
template <typename T>
class a; // error
- 模板名字具有链接
extern "C++" template <typename T>
void func1() {} // 标准链接,是默认的,可以忽略不写,一般也没有写
extern "C" template <typename T>
void func2() {} // error, 不能有C链接
extern "python" template <typename T>
void func3() {} // ok, 非标链接,属于兼容性链接,目前(2002年)还没有编译器实现,
模板通常具有外部链接(唯一的例外是static函数模板),所以函数内部不能声明模板(因为函数内部都是局部对象,不能保证模板名字的唯一性)
模板的声明只能出现在namespace scope或是class scope里
模板的基本类型有两种:类模板和函数模板。那什么叫基本模板?
即普通声明(没有在模板名称后面加< >)
template <typename T> class A;
template <