typename区分类型与static成员
使用类的类型成员
我们通过(::)
来访问static
成员和类型成员.
在普通函数中,编译器掌握类的定义,因此,它知道通过作用域访问符访问的是名字还是static
成员.
但对于模板代码,如T::mem
它不会知道men
是一个类型成员还是一个static
数据成员,知道实例化时才知道.
T::size_type * p;
编译器需要知道我们是正在定义名为p
的变量还是将一个名为size_type
的static
数据成员与名为p
的变量相乘.
如果我们希望使用一个模板类型参数的类型成员,就必须显示告诉编译器该名字是一个类型.我们通过关键字typename
来实现:
template <template T>
typename T::value_type top(const T& c) {
if (!c.empty()) return c.back();
else return typename T::value_type();
}
top函数
期待一个容器类型的实参,它使用typename
指明其返回类型.
当我们希望通知编译器一个名字表明类型时,必须使用关键字 typename 而不是 class