首页 > 代码库 > class与Typename的区别

class与Typename的区别

一:相同点:

  在模板定义时的class和typename是没有区别的

二:不同点:

  1、typename可以表示一个嵌套依赖类型名(nested dependent type name),但是在基类列表成员初始化列表时,可以不用“typename”;

    代码: 

template<class Base>               //此处可以用typename替换
class A : public Base::B           // 基类列表
{
public:
    
    typedef typename Base::B info_type;
    
    A() : Base<T>::B               //成员初始化列表           
    {
        
    }
};

嵌套依赖类型名:  

针对该代码,我们可以发现,在编译时是无法知道Base的具体实现的,那么Base::B,我们则无法判断是一个类型的静态成员,还是一个类的成员函数,那么此处就会产生歧义,这种情况下,编译器默认“如果解析器在一个 template(模板)中遇到一个 nested dependent name(嵌套依赖名字),它假定那个名字不是一个 type(类型),除非你用其它方式告诉它",此时我们就需要typename,来声明Base::B为一个类型,但是在基类列表与成员初始化列表中可以省略。

2、template<typename T, template<typename T> class S>S实际是模板参数,C++规定模板参数只能是class模板,所以这里的class换成typename是不行的。