声明模板的类型参数时,二者的效果完全相同。但是在模板内,有些情况下必须使用typename。也就是说typename除了在模板的声明式中起作用,还会在模板体内起作用,这就是typename和class在全局意义上的不同之处。
嵌套从属名称
如果模板内出现的从属名称呈嵌套状,这样的名称称之为嵌套从属名称。例如:C::const_iterator 其中C为模板参数。
如果模板体内的名称为嵌套从属名称,那么定义这个名称必须使用typename修饰。但是有两个特殊情况,下面详细描述。
基类列表中的名称不能使用typename修饰
如果嵌套从属名称的名称过长,这个时候可以使用typedef重新命名,这就解释了为什么typedef typename 这样看似不合理的并列,然而C++却支持。
原文:https://www.cnblogs.com/lasnitch/p/12256286.html