C++模板中 typename 和 class 的区别

template<typename T>  和  template<class T>

一般情况下,这两个是通用的,也就是在一般情况下是typename 和 class是没有区别的,使用typename或者class只是编码风格的问题。

但是,有一个情况例外,就是在遇到从属类型(dependent type)的时候,为了避免潜在的预防解析二义性,必须用typename而不能用class,换句话说就是当 T 是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template<typename>:

 

C++ 里,要访问名字空间中从属的名字,使用的是 NameSpace::NestName

Container::const_iterator *cit;

 

以上代码有两种解释:

1.声明一个Container::const_iterator 类型的指针变量 cit。那么const_iteratorContainer 里声明的类型

2.const_iteratorContainer 里的一个静态变量,而 cit 是另一个变量。那么这个语句的意思是这两个变量相乘

 

如果 C++ 不允许从属类型名和静态变量名字重名,这样的话好像就可以通过解析类型的定义来确定从属名字是从属类型名还是静态变量名。但是,在使用模板编程时,这会导致很大的混乱。当类名字是一个模板参数,可能导致某些展开产生一个声明,另一些展开产生一个乘法。这种程度的变化,已经不能称作是多态,而是一种可怕的混沌。

 

所以,C++ 中采取的办法是,当类从属名称指向一个从属类型名时,在前面加上 typename 关键字;而不加这个关键字,则认为是静态变量。

例如,typename Container::iterator 是一个类型名,Time::Second 是静态变量。

 

所以

typename T::innerClass   myInnerObject;


这里的 typename 告诉编译器,T::innerClass 是一个类,程序要声明一个 T::innerClass 类的对象,而不是声明 T 的静态成员,如果把 typename 如果换成 class 则会导致语法错误。 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值