关于 typename 的使用场景
在模板编程中,typename 或 class 用于定义模板参数。但在某些场景下,必须使用 typename,例如编写通用打印容器的函数模板时。
#include <iostream>
#include <vector>
#include <list>
using namespace std;
template<class Container>
void Print(const Container& con) {
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;
}
上述代码中,Container 可以是任意容器。运行时会报错,原因在 Container::const_iterator it = con.begin(); 这一行。编译器在从上往下编译到该句时,尚不知晓 Container 的具体类型。它无法判断 const_iterator 是类型还是变量。若为类型则合法,若为静态成员变量则不合法。由于 const_iterator 可能是内部类或 typedef 定义的类型,也可能是静态成员变量,编译器存在歧义。


