GP中,typename的使用频率还是相当高的,由于历史遗留的缘故,在一般情况下typename和class是可以相互替换的。
如下面的代码所示:
template<typename T>
T max(const T&a, const T&b)
{
return a>b ? a : b;
}
template<class T>
T max(const T&a, const T&b)
{
return a>b ? a : b;
}
上述代码中,typename的作用等同于class,两者皆可以相互替换。
但是,在表示一个嵌套从属类型名称的时候,必须显式地使用typename,示例代码如下:
template <typename T>
void print2nd(const T& container)
{
if (container.size() >= 2)
{
//显式告诉编译器这是一个类型
typename T::const_iterator iter(container.begin());
....
}
}
任何时候在template中涉及到一个嵌套从属类型名称,就必须在紧邻它的前一个位置上放上关键字typename。