前言
最近在看STL源码剖析时,遇到关于typename的用法,平常接触到的只是在定义模板参数时使用,直到遇到这个问题我才彻底的查找了typename的用法。先看下一个例子:
typedef typename iterator_traits<_Iter>::value_type value _type;
我们可能对
typedef
很了解,即定义一个别名,其形式是:
typedef
+原类型名+新类型名;因此,我们可以知道typename iterator_traits<_Iter>::value_type
是类型名;但是感到困惑的是这里为什么要使用
typename
关键字?
typename的常规用法
typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数;在下面的例子中,该函数实现泛型交换数据,即交换两个数据的内容,数据的类型由_Tp决定。
template <typename _Tp>
inline void swap(_Tp& __a, _Tp& __b)
{
_Tp __tmp = __a;
__a = __b;
__b = __tmp;
}
typename的第二个用法:修饰类型
在介绍第二个用法之前先了解下一些基本概念,