typename 关键字的特殊用法
在模板参数中,class 和 typename 通常可以互换用来定义类型参数。但在访问嵌套类型时,必须使用 typename。
比如写一个通用的打印容器函数模板:
#include <iostream>
#include <vector>
#include <list>
using namespace std;
template<class Container>
void Print(const Container& con)
{
// 注意这里
typename Container::const_iterator it = con.begin();
while(it != con.end())
{
cout << *it << " ";
it++;
}
cout << endl;
}
int main()
{
vector<int> v = {1, 2, 3, 4, 5, 6};
list<int> lt = {1, 2, 3, 4, 5, 6};
Print(v);
Print(lt);
return 0;
}
如果不加 typename,编译器会报错。因为当编译器读到 Container::const_iterator 时,它还不知道 Container 具体是什么。它无法判断 const_iterator 是一个类型还是一个静态成员变量。如果是变量,那 Container::const_iterator it 就是非法的;如果是类型,那就合法。加上 typename 就是明确告诉编译器:'别猜了,这后面跟的是个类型'。


