有人问我在一个template function里面有时候声明一个变量前面加了一个typename关键字,不知道有什么作用。
晚上回家翻Effecti C++的时候看到了这个东西。我也留心看了一下。
在写模板函数的时候自然而然的要在函数内部用到用template参数定义的数据类型。但是当你用这个template参数来定义变量的时候就会出以下的问题:template参数可能和已有的实际类型重复。举个例子
template<typename C>
void print2nd(const C& container){
C::interator *x;
}
这个地方本意是声明一个C类的迭代器的指针,但是如果C::interator刚好就是一个C的成员变量,而x又刚好是一个全局的变量呢?
那就把声明局部变量变成了一个乘法运算了,有歧义了。
加上typename关键字,就等于告诉编译器:这是个iterator类型,不是乘法。
typename C::iterator *x;
但要注意,这个用法只用在"嵌套从属名称"上面
template<typename C>
void f(const C &container, //这个地方不需要用,也不能用
typename C::iterator iter); //一定要用