了解typename的双重意义
1.template <class T>与template <typename T>没有区别。
typename 的另一种用法,我们以一个代码来解释:
template<typename C>
void print2nd(const C&container)
{
if(container.size()>2)
{
C::const_iterator iter(container.begin());
++iter;
int value=*iter;
std::cout<<value;
}
}
C::const_iterator 的名称依赖于模板参数C,是从属于C的名称,同时带了::符号是一个从属嵌套名称,需要在前面加上typename
template<typename C>
void print2nd(const C&container)
{
if(container.size()>2)
{
typename C::const_iterator iter(container.begin());
++iter;
int value=*iter;
std::cout<<value;
}
}
这样才能通过编译,不然C::const_iterator 完全可能是一个静态变量。
由于 C::const_iter太长我们经常会有这种用法 typedef typename C::const_iter const_iter.
另外注意不要把typename放在基类列表以及成员初始列之中。