码迷,mamicode.com
首页 > 其他好文 > 详细

typename的用法

时间:2015-09-19 00:58:55      阅读:137      评论:0      收藏:0      [点我收藏+]

标签:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
1. //在C++中typename一般用来声明模板的模板参数(template parameter):
   template<typename T> class X;   //T是一个模板参数
    
2. /*但是还有一个关键的用法。首先是两个概念:
   1). qualified name
       例如:std::cout, std::endl;这样含有作用域符号(::)的就是限定名,
       当我们用using声明将cout,endl引入到当前作用域之后就可以直接使用
       这两个名称,这个时候cout,endl就不是限定名了。
   2). dependent name
       dependent name是依赖于模板参数的类型,例如:*/
       template <typename T> class 
       {
           int i;
           std::vector<int> ivec;
           std::vector<int>::iterator iter;
            
           T type;
           std::vector<T> tvec;
           std::vector<T>::iterator titer;
       };
       /* 前3个成员变量是不依赖于模板参数,所以是non-dependent name,后3个是dependent name
       ,直到实例化该模板的时候才会知道到底是什么类型。*/
        
   //下面来讨论typename的第二种用法。现在假设我们有一个类如下:
   template <typename T> class Y
   {
       T::iterator *iter;
       ...
   };
   /* 我们可能本意是想定义一个迭代器对象,例如我们如果用vector<int>来实例化这个模板,那么iter
   则应该是一个迭代器指针,但是,如果我们用下面这个类来实例化这个模板:*/
   class cType
   {
       static int iterator;
       ...
   };
   /* 那么T::iterator *iter会被编译器解释为两个数相乘。事实上,C++编译器会采用第二种解释方法
   ,即使iterator的确是一个类型名。
   为了避免这种矛盾,当我们适用qualified dependent name的时候,需要用typename来指出这是一个
   类型名.即: */
   template <typename T> class Y
   {
       typename T::iterator *iter;
       typedef typename T::iterator iterator; //定义了Y::iterator类型名称
       ...
   };
   //typename 指出下面紧跟着的名称是一个类型

 

           总结:T::iterator这种名称,由于iterator具体是类型还是成员变量取决于T的类型实现,所以当我们

           知道T::iterator是个类型名称时,如果我们要使用这个类型名,前面必须要加typename.

typename的用法

标签:

原文地址:http://www.cnblogs.com/lishuhuakai/p/4820723.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!