模板初学者指南2
原文:http://www.codeproject.com/cpp/templates_part1.asp
重载函数模板
函数模板
函数模板可以被其他的函数模板或是其他函数。编译器将遍历所有可能的函数模板并将创建相应的模板函数。查找使用最优匹配策略。
在模板中使用友元和其他模板
模板类可以包含其他的模板或是类,也可以使用其他类作为友元。当一个模板类包含另外的类时,有下面两种可能:
内部的类可以是一个通常的类。内部类独立于模板参数。否则内部类为另外一个模板。
外部模板类包含另外一个独立的模板(也独立于模板参数)。
template < class ElemType >
class Tree
{
//...
public:
class Node
{
friend Tree < ElemType >;
//...
};
};
此例子中,内部模板类Node独立于Tree。外部类定义为Node的友元,包含参数列表。
模板类型
当使用在模板参数中定义的类型时,应该使用typename来定义:
template < typename T >
class X
{
//...
typename T::X theStuff; // T::X is the type
//...
};
class Test
{
//...
class X { /* ... */ };
};
不使用typename,编译器报错。
枚举模板
当使用枚举模板时,可以创建一个产生对象的通用的类。提供一个枚举函数来分配内存。此枚举函数可以使用模板枚举函数来实现。可以使用任意类型:
class Builder
{
//...
template < class T > static T* allocateMem();
};
注意:模板枚举函数不能为 virtual.
End