分类: C/C++
2013-01-15 20:38:37
1.模板参数中的typename和class意义完全一样,只有在某些老旧的编译器存在差异,或只支持class等等。
template
.....
template
现在绝大部分编译器上,此两者没有差别。
2.依赖于模板某个参数的名称可能导致编译器解析困难,可以用typename声明,例如:
模板参数是一个容器,第5行定义一个该容器的常迭代器。换个角度,如果const_iterator是个类内静态变量或什么成员,
就有可能给编译器带来困难,例如 C::const_iterator * pIter;这条语句是定义一个迭代器指针,却也可以理解为2个变量相乘。
减少这种依赖于模板参数的名字(const_iterator依赖于C),这时可以在前面加typename关键字。
typename C::const_iterator iter(container.begin());
这个括号内的初始化非常精湛啊,本身就减少了歧义,意为定义变量。
templatevoid print2nd(const C& container) { if (container.size() >= 2) { C::const_iterator iter(container.begin()); ++iter; int value = *iter; std::cout << value; } }