博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++模板之typename和class关键字的区别
阅读量:6173 次
发布时间:2019-06-21

本文共 1195 字,大约阅读时间需要 3 分钟。

我们都知道,在STL中基本上都使用了模板类的声明,即template。在模板类的声明中,我们有两种方式:

template 
template

在这里,class和typename是相同的。也就是说,在声明一个template type parameter(模板类型参数)的时候,class和typename意味着 

完全相同的东西。

但是,在C++中,有的时候必须要使用typename.下面我们列举下面一个例子。

关键字typename被用来作为型别之前的标识符号。

template 
class MyClass{ typename T::SubType * ptr; ...};

在这里,typename指出SubType是class T中定义的一个类别,因此ptr是一个指向T::SubType型别的指针。如果没有关键字typename,SubType会被当成一个static成员,于是

T::SubType * ptr

会被解释为型别T内的数值SubType与ptr的乘积。

SubType成为一个型别的条件是,任何一个用来取代T的型别,其内部必须有一个内部型别(inner type)SubType的定义。例如,将型别Q当作template的参数。 

MyClass x;

必要条件是型别Q有如下的内部型别定义:

class Q{    typedef int SubType;    ...};

因此,MyClass的ptr成员应该变成一个指向int型别的指针,子型别SubType也可以成为抽象 

数据型别(例如,class):

class Q{    class SubType;    ...};

  

注意,如果要把一个template中的某个标识符号指定为一种类别,就算是意图显而易见,关键字typename也是不能省略的,因此C++的一般规则是,除了使用typename修饰之外,template内的任何标识符号都被视为一个值而不是一个类别(对象)。

 

总结:

  1. template<typename T>与template<class T>一般情况下这两个通用,但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template<typename>:
  2. typename T::innerClass myInnerObject;这里的 typename 告诉编译器,T::innerClass 是一个类,程序要声明一个 T::innerClass 类的对象,而不是声明 T 的静态成员,而 typename 如果换成 class 则语法错误。

 

转载于:https://www.cnblogs.com/cthon/p/9201649.html

你可能感兴趣的文章
HDU problem 5635 LCP Array【思维】
查看>>
leetcode10. 正则表达式匹配
查看>>
redis常用命令--zsets
查看>>
springcloud--Feign(WebService客户端)
查看>>
网络攻击
查看>>
sorting, two pointers(cf div.3 1113)
查看>>
Scala并发编程【消息机制】
查看>>
win10下安装Oracle 11g 32位客户端遇到INS-13001环境不满足最低要求
查看>>
AngularJS-01.AngularJS,Module,Controller,scope
查看>>
【MySQL 安装过程1】顺利安装MySQL完整过程
查看>>
Inno Setup入门(二十)——Inno Setup类参考(6)
查看>>
图片自适应
查看>>
amd cmd
查看>>
Linux下的uml画图工具
查看>>
xml返回数组数据
查看>>
约瑟夫问题总结
查看>>
spring mybatis 批量插入返回主键
查看>>
指针函数小用
查看>>
开源力量公开课第二十三期-从SVN到Git,次时代代码管理
查看>>
输入挂
查看>>