C++模板中关键字typename与class的区别

一.共同点

在定义类模板或者函数模板时,typenameclass 关键字都可以用于指定模板参数中的类型。

template <typename T>
template <typename N>

二.typename独有的功能

由于 C++ 允许在类内定义类型别名,且其使用方法与通过类型名访问类成员的方法相同。故而,在类定义不可知的时候,编译器无法知晓类似 Type::foo 的写法具体指的是一个类型还是类内成员。

例如在以下代码中,类模板 Bar 的原意是使用类 Foo 实例化,而后引用其中的 bar_type 定义名为 bar 的类内成员。然而,就 T::bar_type 而言,编译器在编译期无法确定它究竟是不是一个类型。此时就需要 typename 关键字来辅助编译器的判断。

class Foo
{public:typedef int bar_type;
};template<typename T>
class Bar {/* typename */T::bar_type bar;
};

值得一提的是,在编译期能够判断的情形,例如在上例中直接使用 Foo::bar_type 时,使用冗余的 typename 会报错。

class独有的功能

class 关键字最众所周知的功能是声明或定义一个类。这当然是其相对 typename 的一个独有功能。为了完整性,这里也列出。

除此之外,在模板的使用中,class 关键字也有其特有的功能。而这是绝大多数文章不会提及的。

C++ 的标准模板库中有名为 std::stack 的容器适配器,它能适配许多容器作为底层,实现栈的功能。其声明为

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

因此,在使用中,我们可以使用 std::stack<int> 来声明一个以 std::deque<int> 保存整型变量的栈;也可以使用 std::stack<int, std::vector<int> > 来声明一个以 std::vector<int> 保存整型变量的栈。

现在的问题是,是否有可能以类似 Stack<int, std::vector> 的形式,来达到同样的目的?

为此,我们需要有类似这样的声明

template <typename T,template <typename E, typename = std::allocater<E> > class Container = std::deque>
class Stack;

由于 Container 必须是一个容器类模板,所以,如果不适用具体的模板参数实例化,就必须将其声明为一个类模板。故此,Container 之前需要保留标准库中容器类模板的模板参数。注意此处使用了标准库提供的内存分配器。

此处 class 特有的功能,体现在 class Container 之处。此处虽然是在声明 Stack 这个类模板,但是此处的 class 不能替换为 typename;否则编译器会报错。

C++模板中关键字typename与class的区别相关推荐

  1. C#中关键字ref与out的区别(转)

    C#中关键字ref与out的区别(转) 在C#中,ref与out是很特殊的两个关键字.使用它们,可以使参数按照引用来传递. 总的来说,通常我们向方法中传递的是值.方法获得的是这些值的一个拷贝,然后使用 ...

  2. 从零开始学C++之模板(三):缺省模板参数(借助标准模板容器实现Stack模板)、成员模板、关键字typename...

    一.缺省模板参数 回顾前面的文章,都是自己管理stack的内存,无论是链栈还是数组栈,能否借助标准模板容器管理呢?答案是肯定的,只需要多传一个模板参数即可,而且模板参数还可以是缺省的,如下: temp ...

  3. java中super关键字_Java中关键字super与this的区别

    一.super关键字 在JAVA类中使用super来引用父类的成分,用this来引用当前对象,如果一个类从另外一个类继承,我们new这个子类的实例对象的时候,这个子类对象里面会有一个父类对象.怎么去引 ...

  4. [转载] python不允许使用关键字_Python中关键字global与nonlocal的区别

    参考链接: Python全局关键字 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/xCyansun/article/details/79672634 ...

  5. Python中关键字global与nonlocal的区别

    终于下定决心学习Python了.既然从头开始,就需要认认真真. 首先需要说的是,我是初学Python,这篇文章只是用于展示global和nonlocal关键字的区别,是很简单的知识点,如果你已经学过, ...

  6. Java中关键字throw和throws的区别

    抛出异常有三种形式 throw throws 系统自动抛异常 一.系统自动抛异常 当程序语句出现一些逻辑错误.主义错误或类型转换错误时,系统会自动抛出异常:(举个栗子) public static v ...

  7. C++模板(关键字template,typename)介绍

    C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数.返回值取得任意类型. 模板是一种对类型进行参数化的工具: 通常有 ...

  8. dedecms 制作模板中使用的全局标记介绍

    解析引擎概述  模板设计规范  代码参考 标记参考: arclist(artlist,likeart,hotart,imglist,imginfolist,coolart,specart) field ...

  9. c++中的typename与class

    在泛型编程的形参表中,关键字typename和class具有相同的含义,可以相互使用,两个关键字都可以在同一模板形参表中使用: 1.  typename用在模板定义里,标明其后的模板参数是类型参数. ...

最新文章

  1. Visual Studio视觉编程工具(推荐四个)
  2. Kubernetes — 生产环境架构简述
  3. Linux 升级 Python 至 3.x
  4. IIS下的FTP使用
  5. 一次C端线上缓存问题的总结
  6. 如何解决机器学习中的数据不平衡问题?
  7. 几种常用控件的使用方法
  8. spring boot 带远程调试启动方式
  9. suse zypper 添加源
  10. 前端工程师做事的三重境界:我的进阶之路
  11. 淘宝京东天猫电商运营每天都需要做什么?
  12. 高一计算机课程教案,高一信息技术复习课教案.doc
  13. 人脸识别-Loss-2018:ArcFace【对CosFace的改进】【ArcFace:直接在角度空间(angular space)中最大化分类界限;CosFace是在余弦空间中最大化分类界限】
  14. 错误变惊喜,10个有趣的404页面设计(转)
  15. 多窗口自动排列横向纵向排列斜排列多窗口排列工具软件教学
  16. mysql 数据库 back_log 参数
  17. xp找不到局域网内其它计算机,在W10局域网内找不到其它共享电脑的解决方案
  18. 计算机辅助绘图 选修,计算机辅助绘图(CAD)教学大纲.doc
  19. oracle数据库与实例的区别与联系
  20. “spoolsv.exe应用程序错误”的解决方法

热门文章

  1. 破解 Ashley Madison 1100万个口令
  2. 前端跨域问题(CORS)
  3. [android] socket在手机上的应用
  4. 【Ajax】PHP中ajax的基本知识点
  5. 数据创建表 修改列 新增列
  6. linux内核编译,内核参数修改
  7. “错题集”帮你期末考试冲向满分
  8. 基于角色(Role-Based)的表单验证
  9. 【github系列】github定位到历史版本(历史commit点)
  10. Flink-org.apache.flink.streaming.api.windowing.windows.Window