《Effective C++》42: 了解 typename 的双重意义

来源:互联网 发布:天下三捏脸数据男贴吧 编辑:程序博客网 时间:2024/06/08 18:33

在 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;//... ...}//... ...};


1 0