《Effective C++》42: 了解 typename 的双重意义
在 t下面 template 声明式中,class 和 typename 意义完全相同。
template <class T> class Widget;
template <typename T> class WIdget;
然而 C++ 并不总是把 class 和 typename 视为等价。 有时候,我们一定得使用typename。
一般来说,在缺省状态下,C++解析器认为在 template 中的嵌套从属名称是个变量,而不是个类型。
如果要告诉解析器,T::const_iterator 是一个类型,只需要在它之前加一个关键字: typename即可。
如:
template <typename T>
void Func(const T& container)
{
typename T::const_iterator iter;
// ... ...
}
但是,“template 必须作为嵌套从属类型名称的前缀词”也是有例外的。
typename 不可以出现在 base classes list内的嵌套从属类型名称之前,
也不可以出现在member initialization list中作为base class修饰符。
例如:
template <typename T>
class Derived : public Base<T>::Nested // base classes list 不允许 “typename”.
{
public:
explicit Derived(int x)
: Base<T>::Nested(x) //不可以出现在member initialization list中作为base class修饰符
{
typename Base<T>::Nested temp;
//... ...
}
//... ...
};