template<typename C>
void print2nd(const C& container)
{
if(container.size() >= 2) {
C::const_iterator iter(container.begin())); //C::iterator 嵌套从属名称
++iter ;
int value = *iter ;
std::cout << value ;
}
}
嵌套从属名称默认不是类型,除非在嵌套从属名称加typename
注:typename只会用来嵌套从属属性名称,其它不该有它存在
template<typename C>
void f(const C& container, // 从属名称,不允许使用typename
typename C::iterator iter); // 嵌套从属名称,一定要使用typename
例外:typename不可出现在base classes list内的嵌套从属类型名称之前,也不可在member initialization list中作为base class修饰符
template<typename T>
class Derived : public Base<T>::Nested{ // base class list中不允许使用typename 即便是嵌套从属属性
public:
explicit Derived(int x)
: Base<T>::Nested(x) // mem.init.list 中不允许typename,即便是嵌套从属属性
{
typename Base<T>::Nested temp ; // 嵌套从属类型名称,既不在base class list中也不在mem.init.list中,需要加typename
}
} ;
例子:
template<typename IterT>
void workWithIterator(IterT iter)
{
typename std::iterator_traits<IterT>::value_type temp(*iter) ;
}
如果IterT是vector<int>::iterator,temp的类型
就是int,如果IterT是list<string>::iterator,temp的类型就是string
std::iterator_traits<IterT>::value_type 是个嵌套从属名称,因为value_type被嵌套于
iterator_traits<IterT>之内,而IterT是个template参数
typedef简写:
template<typename IterT>
void workWithIterator<Iter iter)
{
typedef typename
std::iterator_traits<Iter>::value_type value_type ; // 缩写
value_type temp(*iter) ;
}
说明:以上说明的关于嵌套从属属性的typename在不同
的编译器之间不可移植