• C++中模板函数或模板类中关键词class和typename


    区别


    基本上来说,class和typename几乎没有区别。在可以使用class的地方都可以使用typename,在使用typename的地方也几乎可以使用class。

    可以看出我加黑了两个子:几乎,这说明二者还是有一定区别的。先看下面的代码:

    template <class T> class Collection
    {
        public:
            bool contains(T a); 
            
        private:
            vector <T> object;
    };
    

    以上代码定义了一个模板类Collection,包含似有变量为object,包含一个方法contains用于判断某元素是否在object中。我实现contains方法的基本思路是:遍历整个vector,将每个元素与a进行比较。于是我写下了以下代码:

    template <class T> bool Collection<T>::contains(T a)
    {
        vector<T>::iterator it = object.begin();
        for(; it != object.end(); ++it)
        {
            if(a == *it)
                return true;
        }
        return false;
    }
    

    将上面的代码进行编译就知道,这是错的。错误开源在于,我已经假设vector::iterator是一个type,也即上面代码的第3行我默认是在定义一个vector::iterator类型的变量it,但是事实上,对于未知的类型T,编译器无法确定vector::iterator是一个类型。这个时候必须使用一个关键词typename对其进行描述,明确告诉编译器这是一个类型(type)。

    如果解析器在一个 template(模板)中遇到一个 nested dependent name(嵌套依赖名字),它假定那个名字不是一个 type(类型),除非你用其它方式告诉它。缺省情况下,nested dependent name(嵌套依赖名字)不是 types(类型)。

    一句话总结


    模板定义中,在使用class的地方使用typename都是可以的,但是有的地方必须使用typename而不能使用class(上述情况),因此在编码中尽量使用typename是安全的。

  • 相关阅读:
    vue-router 路由拦截 beforeEach 添加静态路由 与 动态添加路由
    elementUI el-upload 根据上传的图片高度,进行自适应宽度
    vue 中 字符串分两行显示
    MySQL中的<=>
    Spring mvc再启动时候会打印项里面的所有路径
    一次解决前后台交互问题
    数据库表分区,分表
    支付宝接口
    打印js中一个对象的所有属性的值
    var
  • 原文地址:https://www.cnblogs.com/jaletech/p/3890853.html
Copyright © 2020-2023  润新知