Effective C++--条款42: 了解typename的双重含义

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在不同
       的编译器之间不可移植

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值