首页 > 代码库 > 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是不行的。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。