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

		//... ...
	}

	//... ...
};


全部评论

相关推荐

门口唉提是地铁杀:之前b站被一个游戏demo深深的吸引了。看up主页发现是个初创公司,而且还在招人,也是一天60。二面的时候要我做一个登录验证和传输文件两个微服务,做完要我推到github仓库,还要我加上jaeger和一堆运维工具做性能测试并且面试的时候投屏演示。我傻乎乎的做完以后人家跟我说一句现在暂时不招人,1分钱没拿到全是白干
点赞 评论 收藏
分享
05-09 12:23
已编辑
华南理工大学 Java
野猪不是猪🐗:给他装的,双九+有实习的能看的上这种厂我直接吃⑨✌们拿它练练面试愣是给他整出幻觉了
点赞 评论 收藏
分享
06-26 18:30
门头沟学院 Java
据说名字越长别人越关注你的昵称我觉得我要被关注了:你问问这里面有多少是正经候选人,而不是乱打招呼的
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务