C++ typename关键字

C++中typename关键字

下面是摘自https://zh.cppreference.com/w/cpp/keyword/typename的描述

 

C++中的typename关键字常见于模板使用

例如:

  1. 代替class关键字

    template < typename T >

    这里typenameclass关键字的功能一样,是为了取代class关键字而生,原因是class用来代表非类类型时有点歧义,例如用class代表struct类型、int、double类型,这样显得不伦不类。

  2. 在模板中获取变量类型

    示例1:

 1 template <class T>
 2 void foo() {
 3     typename T::iterator * iter;  // typename用于告诉编译器,T::iterator是一个类型而不是一个变量;否则编译器可能认为它是一个乘法操作
 4 }
 5 
 6 struct ContainsAType {
 7     struct iterator;
 8 };
 9 
10 foo<ContainsAType>();

    示例2:

      typename A<T>::k var;      // var变量是A类里面的k变量的类型,这里等同于static int var;

      const typename A<T>::B& func();  // func()返回值是const A作用域下B类的引用

      typedef typename A<T>::B BType;  // 给A作用域下的B类 类型取一个别名为BType

      int func(typename A<T>::k var);    // func函数的参数是A::k类型(static int)

      template < typename T, typename Containter = std::deque<T> > class stack;

      上面的四个例子已经表示typename相当于获取变量的类型

 继承类的列表和参数初始化列表不能出现typename,因为编译器知道继承类的列表必须是类型,参数初始化列表必须是变量,例如:

 1 template<class T>
 2 class Derived: public Base<T>::XXX, public A<T>::YYY  // 父类列表,绝对是类型不可能是变量
 3 {
 4   ...
 5 }
 6 
 7 Derived(int x, int y) : Base<T>::XXX(x), A<T>::YYY(y)  // 参数初始化列表,绝对是变量而不可能是类型
 8 {
 9   ...
10 }

 

转载于:https://www.cnblogs.com/duacai/p/10896064.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值