时常看到这样的代码,比如以下这两段代码:
list<int>::iterator iter1;
list<T>::iterator iter1; 前者没有问题可以顺利的编译过去,但是后者时常会报一个警告,为什么呢?
原因如下:
首先,list<T>是一个模板类,在模板实例化以前是无法确定起真正的类型的,也就是说编译阶段是无法知道到底是哪个类的,那么可能出现以下一种情况:某个类中恰好有一个静态成员为iterator,此时就会出错了。
因此为了明确的指出这是一个类型而不是一个成员,我们需要在前面加上typename,也就是:
typename list<T>::iterator iter1; typename在这里用于说明后面紧跟着的字符串表示的是一个类型。