先说结论,C++引入typename关键字是为了消除二义性
在C++模板常有如下用法:
template <typename T>
int compare(const T &v1, const T &v2)
{
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
这里typename关键字可被class代替。
真正使用typename关键字是因为如下代码具有二义性:
template <class T>
void foo() {
T::iterator * iter;
// ...
}
它可被理解成变量声明式或者乘法表达式。
对于不会引起歧义的情况也要加入typename修饰:
template <class T>
void foo() {
typedef typename T::iterator iterator_type;
// ...
}
参考资料:https://blog.csdn.net/vanturman/article/details/80269081