c++模板中的 typename 和 template 关键字用法

本文探讨了C++模板编程中的两个核心概念:typename和template关键字。通过具体实例解释了typename如何帮助编译器正确解析类型限定符,以及template关键字在模板名称识别中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    最近在看C++的模板,虽然学了、用了C++也有一段时间,对于模板编程这一特性一直没有接触。边学习, 一边写些心得吧。

1. typename关键字
   不用说,接触过模板的人都知道,typename在模板声明的时候可以代替class关键字,二者可以互换,如:

   template<class A, size_t N = 10>    
   class Container
  {
    public:
    void push(const A& a)

    private:
    A a[N];
    size_t count;
           
  };
        

 写成typename也是一样的
 template<typename A, size_t N = 10>    
   class Container
  {
    public:
    void push(const A& a)

    private:
    A a[N];
    size_t count;
           
  };
   
 但是,typename在模板编程中更重要的用法是:当一个模板代码中某个类型被模板类型参数限定时,必须使用typename关键字
什么意思呢?看下面的例子:(借用下 《C++编程思想2》中的例子)

  template<class T>        
  class X
{
   public:
    void f(){ i.g(); }

   private:
    typename T::id i;
};

    上面的例子就是:在模板中,类型T限定了类型id。 也就是说id取决于T。这种情况下,编译器不知道 id是类型T中的静态成员变量,还是T的嵌套类。

   在默认情况下,编译器将id当作静态成员变量或者是枚举来对待。在这个例子中,显然 id 是个类型(但是编译器不知道),这就需要我们通过typename 这个关键字来告诉编译器,将后面的这个 T::id 当作类型,然后声明个变量 i。也就是将被限定的关键字 id 解析成类型。

2. template关键字
   同样 template关键字的作用不言而喻,最常见的 声明模板时用的关键字。他也有特殊的用武之地。

  在模板编程中 < 和 > 字符有时代表小于号,大于号。有时候就是作为模板参数列表的界定符。可以用template关键字来区分。

  template<class charT,size_t N>
  basic_string<charT> bitsetToString(const bitset<N>&bs)
{
  retrun bs. template to_string<charT,char_traits<charT>.allocator<charT> >();        
}

    关键字 template 写在 对象b的点运算符的右边,告诉编译器后面的是个模板的名称。如果不写 template 的话,< 就被解释成小于号。


觉得这两个关键字有点意思,做了下小总结。程序可能有错误的地方,欢迎指正。

PS:参考《C++编程思想》第二卷。本来想自己写些例子的,发现刚接触,水平有限,为了程序没有错,借用书中的例子了。



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值