• C++模板之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内的任何标识符号都被视为一个值而不是一个类别(对象)。

    总结:

    1. template<typename T>与template<class T>一般情况下这两个通用,但有一个特例,就是当 T 是一个类,而这个类又有子类(假设名为 innerClass) 时,应该用 template<typename>:
    2. typename T::innerClass myInnerObject;这里的 typename 告诉编译器,T::innerClass 是一个类,程序要声明一个 T::innerClass 类的对象,而不是声明 T 的静态成员,而 typename 如果换成 class 则语法错误。
  • 相关阅读:
    vue+element目录树默认展开和选中
    vue+element目录树初始化和销毁
    vue父组件通过ref获取子组件的值
    [moka同学笔记转载]Yii2使用$this->context获取当前的Module、Controller(控制器)、Action等
    [moka同学笔记]JS学习 鼠标事件
    [moka同学笔记]phpStudy for Linux (lnmp+lamp一键安装包)
    [转载]php中序列化与反序列化
    [Node.js学习]初之体验
    [moka同学笔记转载]Yii 设置 flash消息 创建一个渐隐形式的消息框
    [moka同学笔记转载]yii2.0 rbac权限学习笔记
  • 原文地址:https://www.cnblogs.com/cthon/p/9201649.html
Copyright © 2020-2023  润新知