标签:style color strong ar 代码 line c++ size
一:相同点:
在模板定义时的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是不行的。
class与Typename的区别,布布扣,bubuko.com
标签:style color strong ar 代码 line c++ size
原文地址:http://my.oschina.net/wangcan/blog/301039