typename与class的区别

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

template <class T>
template <typename T>

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

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

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

template <class T>
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内的任何标识符号都被视为一个值而不是一个型别。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天堂1223

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值