template<typename (class) T>
class Widget { ... };
class
和
typename
均可用于声明模板的形式类型参数,但
typename
能更清楚地表示:
T
可以是任何
类型;不必是一个类。
为了避免潜在的模糊解析,编译器要求在依赖形式类型参数的类型名字之前使用
typename
。这样的类型被称为依赖类型
。
示例:
template<typename C>
bool lastGreaterThanFirst(const C& container)
{
if (container.empty())
return false;
typename C::const_iterator
begin(container, begin());
typename
C::const_ierator end(container.end());
return *--end >
*begin;
}
在这个例子里,局部变量
begin
和
end
的类型是
C::const_iterator
。
const_iterator
是依赖形式类型参数
C
的一种类型。因为
C::const_iterator
是一种依赖类型,你被要求在它之前放上
typename
这个词。(一些编译器错误地接受没有
typename
的代码,但这样的代码不可移植。)