您的位置:首页 > 编程语言 > C语言/C++

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

2016-03-05 13:20 387 查看
在 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;

//... ...
}

//... ...
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: