1、typename和class在模板的类型声明式中,二者有什么不同?
声明模板的类型参数时,二者的效果完全相同。但是在模板内,有些情况下必须使用typename。也就是说typename除了在模板的声明式中起作用,还会在模板体内起作用,这就是typename和class在全局意义上的不同之处。
2、几个重要的概念
- 从属名称
模板内出现的名称如果依赖于某个模板参数,这样的名称就称为从属名称。 - 非从属名称
模板内出现的名称如果不依赖于某个模板参数,这样的名称就称为非从属名称。 - 嵌套从属名称
如果模板内出现的从属名称呈嵌套状,这样的名称称之为嵌套从属名称。例如:C::const_iterator 其中C为模板参数。
3、什么时候必须使用typename修饰?
如果模板体内的名称为嵌套从属名称,那么定义这个名称必须使用typename修饰。但是有两个特殊情况,下面详细描述。
4、两个特殊情况
- 成员初值列中的名称不能使用typename修饰
- 基类列表中的名称不能使用typename修饰
5、关于C++看似不合理设计的一个解释
如果嵌套从属名称的名称过长,这个时候可以使用typedef重新命名,这就解释了为什么typedef typename 这样看似不合理的并列,然而C++却支持。