先说总结,在定义模板的第一行,尖括号里面的typename和class是等价互换的,但是在一种情况下只能用typename
我们来看例子
template<typename T> void test(){ T::iterator *it; //... }
请暂停一会儿, 思考一下这段代码的问题
如果你脑筋急转弯做的足够多, 或者是编程经验足够丰富,大概率是能够一眼看出这段代码的问题的,这个问题来自于一个长久的槽点:C语言声明指针的符号是一个乘号
如果上述代码是一个函数的声明与定义,这无伤大雅,因为编译器会正确解析乘号的语义学正确所指(refer-to)
但是这个是一个模板,在编译前IDE并不能检查到这个模板要接收的类T里面有没有一个叫做 iterator 的成员, 同时, it可能是一个全局变量
iterator
也就是说这段语句完全有可能被编译器判断为一个乘法运算, 其结果没有保存在任何左值当中。
为了避免这个情况可以这样写, 这样IDE就会检查T::iterator是类型还是成员,并正确解释乘号的含义
这里的typename就不能换成class了, 算是固定用法
最后更新于 3年前
template<typename T> void test(){ typename T::iterator *it; //... }