1. 代码即文档
1 // 在使用嵌套依赖类型(nested depended name)时
2 class CArray
3 {
4 public:
5 typedef int LengthType;
6 };
7
8 template<typename T>// 此处(声明模板类型参数, template type argument)与使用template<class T>的效果一样
9 class CMatrix
10 {
11 public:
12 // 如果不用typename指明CArray::LengthType是个嵌套依赖类型,则编译器无法确定
13 // CArray::LengthType是个静态变量还是嵌套依赖类型
14 typedef typename CArray::LengthType LengthType;
15 };
16
17 // 另一个例子能够更加明显地说明问题
18 void func(CArray& arr)
19 {
20 // 定义一个LengthType类型的指针
21 CArray::LengthType* pLength;
22 // 想想编译器可能会怎么解释上面的表达式
23 // 可能把LengthType解释为类CArray的一个静态变量,与pLength相乘
24 // 我们可以这样来解决这个歧义
25 typedef typename CArray::LengthType LengthType;
26 LengthType* pLength;
27 // 我们也可以这么做...
28 typename CArray::LengthType *pLength(0);
29 }
30
31 // ok,看完这些例子,想做个小结
32 // typename,看看它的意思是多么的明确,它告诉编译器它后面的东西就是个type的名字,而不是变量之类其他的东西
33 // 所以,在模板类型参数中,告诉编译器T是个type name
34 template<typename T>
35 class CArray
36 {};
37
38 // 所以,在嵌套依赖类型中告诉编译器CArray::LengthType是个type name,而不是静态变量
39 template<typename T>
40 class CMatrix
41 {
42 typedef typename CArray::LengthType LengthType; // 告诉编译器typename后的CArray::LengthType是个type name.
43 };

浙公网安备 33010602011771号