一,关键字class和typename的区别
关键字class和typename的区别
- 关键字class和typename的区别
- 一,相同点class和typename
- 二,class独特点
- 三,typename独特点
一,相同点class和typename
在c++标准模板库,也就是STL中,使用了模板,在声明类模板和函数模板时,有两种方式
其中class和typename是类模板或者函数模板中模板参数的类型。
template<class T>;
void Func();
template<typename T>;
void Func();
上述两种声明方式是没有任何区别的,也就是说,在声明类模板或者函数模板时,关键字class和typename的用法上没有任何区别。
二,class独特点
1,class可以声明或定义一个类。
2,模板模板参数
template <template <class> class Container> // 传统写法
class MyAdapter {};
注意:C++17之后才允许:template <template <typename> typename Container>
三,typename独特点
嵌套依赖类型场景,在此场景下,必须使用typename。
template <class T>
struct MyClass
{typename T::Type x; // 必须用typename
};
如果我们不加typename,编译器就会分不清楚T::Type
到底是类型还是静态成员,编译就会报错,所以为了让编译器明确知道T::Type是一个类型而非静态成员,就必须加上typename。