《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;

		//... ...
	}

	//... ...
};


全部评论

相关推荐

不愿透露姓名的神秘牛友
11-27 10:46
点赞 评论 收藏
分享
某牛奶:一觉醒来全球程序员能力下降200%,小伙成功scanf惊呆在座个人。
点赞 评论 收藏
分享
评论
点赞
1
分享
牛客网
牛客企业服务