相同之处
一般对模板参数类型typename
和class
认为是一样的. 这两者在参数类型中确实是一样的,以下两种定义都行。
1 | template<class T> |
1 | template<typename T> |
两者typename
和class
在参数类型中没有不同。
为什么定义这两个符号呢?
- 最开始定义定义模板的方法就是
template<class T>
, 但是class
毕竟都认为是一个类, 在使用时难免会有些点混淆, 也就定义了typename
来标志参数类型 - 最重要关于
typename
可以使用嵌套依赖类型, 也就是类型可以嵌套使用. 这也是两个的不同之处。
不同之处
typename
可以用在嵌套依赖中, 并且表示其类型, 而class
并没有这样的功能.
1 |
|
typename
可以嵌套使用,
typename
告诉编译器这不是一个函数, 也不是一个变量而是一个类型. 这里使用typedef
又将参数类型重新定义一次,增加了一层间接性,使用的时候也不需要在写很长的代码
这里typename
是对people类中定义的类型进行了一次提取, 这里将typename
改为class
就会出错。
typename主要的作用
对于模板参数是类的时候, typename
能够提取出该类所定义的参数类型.
并不是所有的嵌套依赖类型都要加上typename
, 有一个例外 : 当继承列表或成员初始化列表中对基类进行初始化的时候, 可以去掉typename
关键字。
1 | man(int x) : T::value_type(x) {} |
总结:
typename
和class
在作为参数类型时用法一样, 没有区别typename
主要用于对嵌套依赖类型进行提取(萃取). 而class
没有这样的功能.typename
提取的一个例外是在继承或成员初始化列表中对基类进行初始化时不用加typename
关键字
转载于:https://blog.csdn.net/Function_Dou/article/details/84644963