typename的两个意思
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的两个意思相关推荐
- typename 的两种用法
问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> class Widget; / ...
- typename的两种用法
普通模板声明中typename和class的用法一样,如下: template<typename T> class test_typename{ };template<class T ...
- 【C++】typename
参考<Effective C++>条款42:Understand the two meaning of typename Table of Contents 1 模板参数列表中与class ...
- typename的作用
一.与class的区别 template声明式中,class和typename这两个关键字意义完全相同 template<class T> class Widget; template ...
- c++中typename和class的区别介绍
"typename"是一个C++程序设计语言中的关键字.相当用于泛型编程时是另一术语"class"的同义词.这个关键字用于指出模板声明(或定义)中的非独立名称( ...
- 泛函编程—模板函数_类模板
函数业务逻辑一样,只是函数参数类型不同 函数模板的本质:类型参数化--泛型编程 语法: template <typename T> template <class T1,class ...
- java可以使用c语言中的输入,c语言中的scanf在java中应该怎么表达,Scanner类。
1 java是面向对象的语言 它没有像C语言中的scanf()函数,但是它的类库中有含有scanf功能的函数 2 java.util包下有Scanner类 Scanner类的功能与scanf类似 3 ...
- C++11 移动语义与右值引用
1.移动语义 C++11 新标准中一个最主要的特性就是提供了移动而非拷贝对象的能力.如此做的好处就是,在某些情况下,对象拷贝后就立即被销毁了,此时如果移动而非拷贝对象会大幅提升程序性能.参考如下程序: ...
- effective C++ 第三版
effective C++ 条款 55:让自己熟悉boost 摘要:高质量,源码开放.平台独立.编译器独立的程序库. http://boost.org,它和c++标准委员会之间有着独一无二的密切关系, ...
最新文章
- Nature子刊:三代测序重构菌株水平宏基因组序列的计算框架iGDA
- 修复 Windows XP/2003 双系统无法启动
- 远程桌面解决(面对不同问题)连接办法
- KFold、StratifiedKFold、GroupKFold的区别
- 累了,开心一下。传说中的脑壳进水
- submlime text写java_在Sublime Text 3中配置编译和运行Java程序
- MacOSX系统下HomeBrew安装指定版本的软件 IntelliJ IDEA 设置多个Go语言版本开发
- openstack network
- PHP包管理器PEAR 中爆多个缺陷可发动供应链攻击,已潜伏15年
- Hudson安装配置文档
- count(*) 的实现方式
- Exchange管理界面
- vim 配置(ma6174 + YCM)
- emule服务器无响应是什么原因,为什么,一直无响应,求大神帮忙
- php 点击电话号码直接拨打,在网站上为手机用户提供”点击拨打电话”功能
- 如何配置使用新的单线激光雷达
- 几倍根号用学生计算机,几倍根号几怎么算不要网上抄的 祥细的 例如2√2 3√3 4√4 怎么算...
- 如何激活和停用NVivo的许可证
- JS-String类型及方法
- labelshop更改打印机_条形码生成器签赋LabelShop打印流程
热门文章
- 2019阿里云峰会·北京 | 十年再出发
- KEIL安装新版本后编译出现无法打开 core_cm3.h 问题
- Python学习笔记(四)----Pywin32+Pyinstaller制作windows软件
- 中科云谷正式落户上海临港 构筑工业互联网新图景
- 依赖注入是什么?Go是如何实现依赖注入的?
- 蓝桥杯泊松分酒java_蓝桥杯-泊松分酒 - steven_wjg的个人空间 - OSCHINA - 中文开源技术交流社区...
- 2021中国大学生喜爱雇主榜发布;调查显示九成员工正经历“职业倦怠”工作危机 | 美通企业日报...
- tomcat配置url跳转_Tomcat
- 「干货」Snort使用手册「详细版」
- 什么是overlay?如何定制overlay?