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 是变量名,于是就允许编译通过了。下面我们修改一下然后测试


测试结果如下:
![]()
本文探讨了typename在C++模板编程中的关键作用,特别是在解决嵌套类型依赖问题上的应用。通过一个函数模板的例子,展示了typename如何告诉编译器T::iterator是一种类型,从而避免编译错误。通过使用typename,确保了模板在实例化时能够正确识别和处理相关类型。
368

被折叠的 条评论
为什么被折叠?



