这个实现了Queue一个数据元素:string对象的Queue。各个成员将它们的工作委派给这个成员。
Queue类的这个版本没有定义复制控制成员,它唯一的数据成员为类类型,该类类型在被复制、被赋值或被撤销时完成正确的工作。可以使用合成的复制控制成员。
这个Queue类实现了与Queue的模板版本大部分相同但不完全相同的接口,区别在于front成员返回的是string而不是char*,这样做是为了避免必须管理字符数组――如果想要返回指针,就需要字符数组。
值得注意的是:特化可以定义与模板本身完全不同的成员。如果一个特化无法从模板定义某个成员,该特化类型的对象就不能使用该成员。类模板成员的定义不会用于创建显式特化成员的定义。
【最佳实践】
类模板特化应该与它所特化的模板定义相同的接口,否则当用户试图使用未定义的成员时会感到奇怪。
2、类特化定义
在类特化外部定义成员时,成员之前不能加template<>标记。
void Queue::push(const char *p) { return real_queue.push(p); }
虽然这个函数几乎没有做什么工作,但它隐式复制了val指向的字符数组。复制是在对real_queue.push的调用中进行的,该调用从constchar* 实参创建了一个新的string对象。constchar * 实参使用了以constchar * 为参数的string构造函数,string构造函数将val所指的数组中的字符复制到未命名的string对象,该对象将被存储在push到 real_queue的元素中。