effective c++条款42:了解typename的双重意义
记录下自己在看书时认为重要的东西防止忘记…
第一种是应用在template的声明式中:
c++
template<class T>
class b1;
template<typename T>
class b2;

这里的class和typename起的作用是一样的,是等价的,写法的差异来自于没有typename时好多人用class来声明,typename引入后class也没有被废弃,书上说最好是使用typename。

第二种是使用typename标注嵌套从属类型名称,但不可再base class lists(基类列)和member initialization list(成员初值列)内以它作为base class修饰符。
下面介绍从属名称和嵌套从属类型名称。
exm:

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;}
}

ps:这些代码是编译不过的,原因是C::const_iterator iter部分会造成歧义,原因是(书中描述):在我们知道C是什么之前,没有任何办法可以知道C::const_iterator 是否为一个类型,而当编译器开始解析template print2nd时,尚未确知c是什么东西,c++有个规则可以解析此一歧义状态:如果解析器在template中遭遇一个嵌套从属名称他便假设这个名称不是个类型,除非你告诉他是,所以缺省情况下嵌套从属名称不是类型,,若要矫正这个形式,我们必须标识c::const_iterator是个类型,代码形式是:

template<typename C>
void print2nd(const C& container){if(container.size()>=2){typename C::const_iterator iter(container.begin());...
}

typename必须作为嵌套从属类型名称的前缀词的例外是,不可以出现在base classes list内的嵌套从属类型名称前,也不可在member initialization list 中作为base class修饰符。例如:

template<class T>
class derived:public base<T>::nested{ //base class list 中不允许'typename'
public:explicit derived(int x):base<T>::nexted(x){//mem.init.list中不允许使用'typename'typename base<T>::nested temp;//嵌套从属类型需要加typename...}...
};

最后再写一个经常遇见的代码:

template<typename T>
void workWithIterator<T iter>{typename std::iterator_traits<T>::value_type temp(*iter);...
}

作用是:接受一个迭代器,做一份local副本temp。iterator_traints::value_type 的意思是类型为T的对象所指之物的类型。

typename的两个意思相关推荐

  1. typename 的两种用法

    问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> class Widget; / ...

  2. typename的两种用法

    普通模板声明中typename和class的用法一样,如下: template<typename T> class test_typename{ };template<class T ...

  3. 【C++】typename

    参考<Effective C++>条款42:Understand the two meaning of typename Table of Contents 1 模板参数列表中与class ...

  4. typename的作用

    一.与class的区别 template声明式中,class和typename这两个关键字意义完全相同 template<class T> class Widget;   template ...

  5. c++中typename和class的区别介绍

    "typename"是一个C++程序设计语言中的关键字.相当用于泛型编程时是另一术语"class"的同义词.这个关键字用于指出模板声明(或定义)中的非独立名称( ...

  6. 泛函编程—模板函数_类模板

    函数业务逻辑一样,只是函数参数类型不同 函数模板的本质:类型参数化--泛型编程 语法: template <typename T> template <class T1,class ...

  7. java可以使用c语言中的输入,c语言中的scanf在java中应该怎么表达,Scanner类。

    1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...

  8. C++11 移动语义与右值引用

    1.移动语义 C++11 新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力.如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升程序性能.参考如下程序: ...

  9. effective C++ 第三版

    effective C++ 条款 55:让自己熟悉boost 摘要:高质量,源码开放.平台独立.编译器独立的程序库. http://boost.org,它和c++标准委员会之间有着独一无二的密切关系, ...

最新文章

  1. Nature子刊:三代测序重构菌株水平宏基因组序列的计算框架iGDA
  2. 修复 Windows XP/2003 双系统无法启动
  3. 远程桌面解决(面对不同问题)连接办法
  4. KFold、StratifiedKFold、GroupKFold的区别
  5. 累了,开心一下。传说中的脑壳进水
  6. submlime text写java_在Sublime Text 3中配置编译和运行Java程序
  7. MacOSX系统下HomeBrew安装指定版本的软件 IntelliJ IDEA 设置多个Go语言版本开发
  8. openstack network
  9. PHP包管理器PEAR 中爆多个缺陷可发动供应链攻击,已潜伏15年
  10. Hudson安装配置文档
  11. count(*) 的实现方式
  12. Exchange管理界面
  13. vim 配置(ma6174 + YCM)
  14. emule服务器无响应是什么原因,为什么,一直无响应,求大神帮忙
  15. php 点击电话号码直接拨打,在网站上为手机用户提供”点击拨打电话”功能
  16. 如何配置使用新的单线激光雷达
  17. 几倍根号用学生计算机,几倍根号几怎么算不要网上抄的 祥细的 例如2√2 3√3 4√4 怎么算...
  18. 如何激活和停用NVivo的许可证
  19. JS-String类型及方法
  20. labelshop更改打印机_条形码生成器签赋LabelShop打印流程

热门文章

  1. 2019阿里云峰会·北京 | 十年再出发
  2. KEIL安装新版本后编译出现无法打开 core_cm3.h 问题
  3. Python学习笔记(四)----Pywin32+Pyinstaller制作windows软件
  4. 中科云谷正式落户上海临港 构筑工业互联网新图景
  5. 依赖注入是什么?Go是如何实现依赖注入的?
  6. 蓝桥杯泊松分酒java_蓝桥杯-泊松分酒 - steven_wjg的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. 2021中国大学生喜爱雇主榜发布;调查显示九成员工正经历“职业倦怠”工作危机 | 美通企业日报...
  8. tomcat配置url跳转_Tomcat
  9. 「干货」Snort使用手册「详细版」
  10. 什么是overlay?如何定制overlay?