zoukankan      html  css  js  c++  java
  • 【C++】typename

    1 模板参数列表中与class关键字可相互替换

    template<typename T> & template<class T>是一样的.

    2 嵌套从属名称(nested dependent names)

    假如template内出现的名称如果依赖于某个模板参数,则称其为从属名称(dependent names),如果从属名称在class内呈嵌套状则称之为嵌套从属名称(nested dependent names)。
    例如:

    templaet <typename T>
    void myPrint(const T& t){
        t::const_iterator iter(t.begin());
    }

    假设模板参数列表中的参数表示一个容器类型,则我们知道t::const_iterator一个依赖模板参数并且在容器内部,所以t::const_iterator是一个嵌套从属名称。

    在我们知道t是什么之前没有办法可以知道t::const_iterator是否是一个类型,因为有还可能是个静态(static)成员变量,考虑下面的例子:

    template <typename T>
    void myPrint(const T& t){
        t::const_iterator * x;
    }

    如果const_iterator是t的静态成员变量,则上面的t::const_iterator * x;中的*表示乘法,如果是个类型则表示声明一个指向t::const_iterator类型的指针。
    从而给编译器造成困惑(因为我们不知道t是什么)。


    C++有个规定:当解析器在模板中遇到一个嵌套从属名称时便假定这个名称不是类型,除非你用关键字typename指定它是:

    template <typename T>
    void myPrint(const T& t){
        typename t::const_iterator * x;     //这样便不会造成困惑了
    }

    同理不仅在内部,在参数列表里也是:

    template <typename T>
    void f(const T& t, typename T::const_iterator cit){//T不是嵌套从属名称,而T::const_iterator是,所以要在T::const_iterator前面加上typename
        //....
    }
    

      

    3 是嵌套从属名称但不用加typename的两种情况

    基类列表(base list)和成员初始化列表(member initializaiton list)

    template <typename T>
    class Derived: public Base<T>::Nested {                 //基类列表中不允许使用typename
    public:
        explicit Derived(int x): Base<T>::Nested(int x){    //初始化列表中不允许使用typename
            typename Base<T>::Nested temp;                  //嵌套从属名称(既不在基类列表中又不在初始化列表中)前面必须要加typename
        }
    }
    

    ZZ:http://www.cnblogs.com/visayafan/ 

  • 相关阅读:
    BZOJ2705[SDOi2012]Longge的问题
    Ubuntu 18.04 打不开1.1.0版本网易云音乐的解决方法汇总
    BZOJ3295[CQOI2011]动态逆序对(CDQ分治)
    hdu-4638-Group(树状数组)
    hdu-3333-Turing Tree(树状数组)
    UVA-11983-Weird Advertisement(线段树+扫描线)[求矩形覆盖K次以上的面积]
    ZOJ-3597-Hit the Target!(线段树+扫描线)
    POJ-1177-Picture(线段树+扫描线+离散化)[矩形周长并]
    POJ-1151-Atlantis(线段树+扫描线+离散化)[矩形面积并]
    LightOJ 1135(线段树)
  • 原文地址:https://www.cnblogs.com/lqminn/p/2679160.html
Copyright © 2011-2022 走看看