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的意义完全一样。

原文链接: https://www.cnblogs.com/yaowen/p/4809492.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/221926

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 上午11:29
下一篇 2023年2月13日 上午11:29

相关推荐