typedef和typename关键字

1、类型说明typedef

类型说明的格式为:

typedef  类型 定义名;

类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型。定义名表示这个类型的新名字。只是个别名而已。

例如: 用下面语句定义整型数的新名字:

1 typedef int TYPE_INT;

使用说明后, TYPE_INT就成为int的同义词了, 此时可以用TYPE_INT定义整型变量。

例如:  TYPE_INTm, n;(与int m, n等效)。

typedef同样可用来说明结构、联合以及枚举和类。就不一一举例了。

2、类型解释Typename

Typename关键字告诉了编译器把一个特殊的名字解释成一个类型,在下列情况下必须对一个name使用typename关键字:

1.  一个唯一的name(可以作为类型理解),它嵌套在另一个类型中的。

2.  依赖于一个模板参数,就是说:模板参数在某种程度上包含这个name。当模板参数使编译器在指认一个类型时产生了误解。

比如如下代码:

 1 template<class C,class T> int count(const C&v,T val)
 2 {
 3     typename C::const_iterator i = find(v.begin(),v.end(),val);
 4     int n = 0;
 5     while (i != v.end())
 6     {
 7         ++ n;
 8         ++ i;
 9         i = find(i,v.end(),val);
10     }
11 
12     return n;
13 }

保险起见,你应该在所有编译器可能错把一个type当成一个变量的地方使用typename。就像上面那个例子中的typename C::const_iterator,因为我们使用了typename,所以编译器就知道了它是一个类型,可以用来声明并创建实例。

原文地址:https://www.cnblogs.com/hwm520hlf1314/p/3457850.html