typename的使用场合有两种,第一种场合是在声明函数模板或者类模板的时候,如
template<typename T> //template<class T>
class mylist
{
private:
T t;
}
但我个人的重点是第二种场合,解决嵌套类型依赖问题
下面就以一个函数模板为例,该函数模板输入类型是T,T为 vector 或者 list,我希望通过迭代器打印出第一个元素的内容
测试结果如何呢?我们发现编译出错,函数模板只有在被实例化的时候才知道 T 是什么类型,在编译阶段 无法获取到 T 的迭代器,因为此时编译器把 T::iterator 当作一个变量看待
模板是一张房屋设计图,房屋被建造出来了(实例化),才知道是不是有花园或者车库
为了解决这个问题,我们引入了 typename ,typename会告诉编译器,这是一种类型,这样的话,编译器就知道 T::iterator 是类型,而 it 是变量名,于是就允许编译通过了。下面我们修改一下然后测试
测试结果如下: