typename在很多种情况下与class是完全相同的,例如下面的使用:

 templame<typename T>
......
template<class T>
......

条款42:了解typename的双重含义

 template<typename C>
void print2nd(const C containter)
{
if(containter.size() >= ){
C::const_iterator iter(containter.begin());
++iter;
int value = *iter;
cot << value;
}
}

上面这个式子是无法通过编译的:这里的const_iterator实际上是个嵌套从属名称,编译器实际上并不知道这是个类型名称的。所以除非我们主动的告诉编译器这是个类型名,否则其就会报错:

 typename C::const_iterator iter(container.begin());

那么也就是说:任何时候想要在template中指涉一个嵌套从属类型名称的话,那么就需要在起前面放上typename关键字。当然他typename仅仅可以用在这个方面,其他的非嵌套从属类型名称上用typename实际上是不允许的:

 template<typename C>
void f(const C & container, //注意,这里的C前面即不允许加上typename
typename C::iterator iter);
还有两种其他的不允许使用typename的特殊情况是:typename不可以出现在base class list内的嵌套从属类型名称之前,也不能在成员初始化列表中修饰base class
 
 
STL中经常也会用到了typename:
 template<typename T>
void workWithIterator(Iter iter)
{
typename std::iterrator_traits<Iter>::value_type tmp(*iter);
}

这里用iterator_traits机制将iterator的value_type强制的萃取出来了,中间很长的变量声明实际上可以作为一个typedef:

 typedef typename std::iterrator_traits<Iter>::value_type value_type;

之后就可以肆无忌惮的使用value_type了,避免过长的声明式。

条款42:了解typename的双重含义的更多相关文章

  1. Effective C++ Item 42 了解 typename 的双重意义

    本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:声明 template 參数时,前缀keyword class 和 typename ...

  2. 读书笔记_Effective_C++_条款四十二:了解typename的双重意义

    顾名思义,typename有双重含意.只要你用过template,那么第一重含意一定知道,那就是声明模板的时候,我们既可以这样写: template <class T> 也可以这样写 te ...

  3. Effective C++ -----条款42:了解typename的双重意义

    声明template参数时,前缀关键字class和typename可互换. 请使用关键字typename标识嵌套从属类型名称:但不得在base class lists(基类列)或member init ...

  4. 【42】了解typename的双重意义

    1.在template声明中,class与typename是等价的,但是使用typename更好. 2.在template实现中,模版形参是从属名称,嵌套在模版形参中的类型是嵌套从属名称,不依赖任何t ...

  5. 读书笔记 effective c++ Item 42 理解typename的两种意义

    1. class和typename意义相同的例子 问题:在下面的模板声明中class和typename的区别是什么? template<class T> class Widget; // ...

  6. 读书笔记 effective c++ Item 42 理解typename的两种涵义

    1. class和typename含义相同的例子 问题:在下面的模板声明中class和typename的区别是什么? template<class T> class Widget; // ...

  7. Effective C++ 条款42

    本节条款我们讨论一下class 关键字和typename关键字的不同以及对于模板函数(template function)的影响. 例如以下代码: template<class T> T ...

  8. 认清Linux中标准输入和标准输出的双重含义

    按照惯例,UNIX系统shell使用文件描述符0与进程的标准输入(一般是键盘)相关联,文件描述符1与标准输出(一般是显示器)相关联,文件描述符2与标准出错输出(一般是显示器)相关联. 在依从POSIX ...

  9. [EffectiveC++]item42:了解typename的双重意义

随机推荐

  1. Oracle11g用户频繁锁定并且解锁后不允许登录

    原因有可能是oracle的密码过期机制导致的:一.由于Oracle中默认在default概要文件中设置了“PASSWORD_LIFE_TIME=180天”所导致.解决办法:1.查看用户用的哪种prof ...

  2. SpringMVC:学习笔记(6)——转换器和格式化

    转换器和格式化 说明 SpringMVC的数据绑定并非没有限制,有案例表明,在SpringMVC如何正确绑定数据方面是杂乱无章的,比如在处理日期映射到Date对象上. 为了能够让SpringMVC进行 ...

  3. SpringBoot整合Redis集群

    一.环境搭建 Redis集群环境搭建:https://www.cnblogs.com/zwcry/p/9174233.html 二.Spring整合Redis集群 1.pom.xml <proj ...

  4. SpringBoot Redis工具类封装

    1.接口类 package com.sze.redis.util; import java.util.List; import java.util.Set; import java.util.conc ...

  5. ES6 随记(2)-- 解构赋值

    上一章请见: 1. ES6 随记(1)-- let 与 const 3. 解构赋值 a. 数组的解构赋值 let [a1, b1, c1] = [1, 2, 3]; console.log(a1, b ...

  6. BEM(一种 CSS 命名规则)

    一. 什么是 BEM BEM的意思就是块(block).元素(element).修饰符(modifier),是由 Yandex 团队提出的一种前端命名方法论. 这种巧妙的命名方法让你的 CSS 类对其 ...

  7. Delphi 2005 以上版本GIF动画播放设置

    源: Delphi 2005 以上版本GIF动画播放设置

  8. PHP 面向对象及Mediawiki 框架分析(一)

    此文是一JAVA哥大神写的,虽然他不懂PHP.我这人PHP半桶水,面向对象更是半桶水都没有,此文原本是为了让我理解MediaWiki的运行机制的,愣是用他的JAVA的面向对象知识,对Mediawiki ...

  9. iOS_网络编程

    网络编程中有以下几种方式向服务器进行提交数据: IOS同步请求.异步请求.GET请求.POST请求 1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可 ...

  10. Python的operator.itemgetter函数和sorted函数

    写这篇文章的目的是之前在<机器学习实战>用Python3实现KNN算法时用到的几个函数不太懂, 地址: 1- https://github.com/hitergelei/Self-Lear ...