• C++ typedef typename


    [cpp] view plaincopy
    template<typename T>   
    class A {  
    public:  
        typedef T a_type;  
    };  
    template<typename A>  
    class B {  
    public:  
        //typedef A::a_type b_type;  
        typedef typename A::a_type b_type;  
    };  
    int main() {  
        B<A<int>> b;  
        return 0;  
    }  
    如果把注释取消,就会产生编译错误。
    
    必须使用关键字typename的原因是T是一个template parameter。在实例化之前,编译器对T一无所知,因此不知道A::a_type 代表的是一个type或是一个member function或是一个data member,使用typename可以告诉编译器这是一个type使得编译能顺利通过
    typename   var_name;表示var_name的定义还没有给出,这个语句通常出现在模版的定义内,例如: 
    template   
    void   f()   { 
        typedef   typename   T::A   TA;           //   声明   TA   的类型为   T::A 
        TA   a5;                                             //   声明   a5   的类型为   TA 
        typename   T::A   a6;                           //   声明   a6   的类型为   T::A 
        TA   *   pta6;                                           //   声明   pta6   的类型为   TA   的指针 
    } 
    
    因为T是一个模版实例化时才知道的类型,所以编译器更对T::A不知所云,为了通知 
    编译器T::A是一个合法的类型,使用typename语句可以避免编译器报错。 
    2)template   <   typename   var_name     >   class   class_name;   表示var_name是一个类型, 
    在模版实例化时可以替换任意类型,不仅包括内置类型(int等),也包括自定义类型class。 
    这就是问题中的形式,换句话说,在template 和template 中, 
    typename和class的意义完全一样。 
  • 相关阅读:
    发音技巧
    SCROM标准和一些概念(转)
    我要告诉测试新手的 (转)
    LCMS与LMS
    SCORM标准的LMS ELearning 学习平台介绍
    【转载】经常在网上看人家的帖子,分享给组里面的兄弟共赏
    选择学习管理系统(LMS)不可忽略的十大要素
    委托(delegate)的使用
    LMS/LCMS相关概念简介
    软件测试
  • 原文地址:https://www.cnblogs.com/yaowen/p/4809492.html
Copyright © 2020-2023  润新知