5.9 练习

5-1 编写一个具有单一类型模板参数的一元函数模板。用类型int生成它的一个完全特化。再为这个拥有单一的int参数的函数产生一个非模板重载。在主函数中调用这三个函数。

5-2 编写一个类模板,该类模板用vector实现一个栈数据结构。

5-3 对习题(5-2)的解答进行修改,使得用来实现栈的容器的类型是一个模板类型的模板参数。

5-4 在下面的代码中,类NonComparable中没有operator=()。解释一下为什么类HardLogic的出现引起了一个编译错误,而SoftLogic却没有?

5.9 练习 - 图1

5-5 编写一个持有单一类型参数(T)的函数模板,它接受了4个函数参数:一个T类数组、一个开始索引值、一个结束索引值(在允许范围之内的)和一个可选择的初始值。函数返回指定范围内所有数组元素值与初始值的和。用默认构造函数为T类型的数据用默认方式赋初值。

5-6 重做上面的习题,根据本章讨论过的技术,使用显式实例化来手工生成int和double的特化。

5-7 请指出为什么下列代码无法编译?(提示:看看类成员函数访问了什么?)

5.9 练习 - 图2

5-8 指出下面的代码为什么无法编译?

5.9 练习 - 图3

5-9 编写一些持有下列多种无类型参数的模板:一个int、一个指向int的指针、一个指向int类型的静态类成员的指针和一个指向一个静态成员函数的指针。

5-10 编写一个持有两个类型参数的类模板。为第1个参数定义半特化,另一个半特化指定第2个参数。在每一个特化中,都采用没有出现在基本模板中的成员。

5-11 定义一个持有单一类型参数的类模板,将其命名为Bob。使Bob成为一个名为Friendly的模板类的所有实例的友元,并且成为一个名为Picky的类模板的友元—仅当Bob和Picky的类型参数完全相同的时候。提供一些能证明这些类的友元关系的Bob成员函数。