c++ typename用法
1. //在C++中typename一般用来声明模板的模板参数(template parameter):
template<typename T> class X; //T是一个模板参数
2. /*但是还有一个关键的用法。首先是两个概念:
1). qualified name
例如:std::cout, std::endl;这样含有作用域符号(::)的就是限定名,
当我们用using声明将cout,endl引入到当前作用域之后就可以直接使用
这两个名称,这个时候cout,endl就不是限定名了。
2). dependent name
dependent name是依赖于模板参数的类型,例如:*/
template <typename T> class X
{
int i;
std::vector<int> ivec;
std::vector<int>::iterator iter;
T type;
std::vector<T> tvec;
std::vector<T>::iterator titer;
};
/* 前3个成员变量是不依赖于模板参数,所以是non-dependent name,后3个是dependent name
,直到实例化该模板的时候才会知道到底是什么类型。*/
//下面来讨论typename的第二种用法。现在假设我们有一个类如下:
template <typename T> class Y
{
T::iterator *iter;
...
};
/* 我们可能本意是想定义一个迭代器对象,例如我们如果用vector<int>来实例化这个模板,那么iter
则应该是一个迭代器指针,但是,如果我们用下面这个类来实例化这个模板:*/
class cType
{
static int iterator;
...
};
/* 那么T::iterator *iter会被编译器解释为两个数相乘。事实上,C++编译器会采用第二种解释方法
,即使iterator的确是一个类型名。
为了避免这种矛盾,当我们适用qualified dependent name的时候,需要用typename来指出这是一个
类型名.即: */
template <typename T> class Y
{
typename T::iterator *iter;
typedef typename T::iterator iterator; //定义了Y::iterator类型名称
...
};
//typename 指出下面紧跟着的名称是一个类型
总结:T::iterator这种名称,由于iterator具体是类型还是成员变量取决于T的类型实现,所以当我们
知道T::iterator是个类型名称时,如果我们要使用这个类型名,前面必须要加typename.
c++ typename用法相关推荐
- C++(八)——typename用法
1.typename来源 1.1原因1: 从表面上看,下面模板的参数只支持用户自定义类型,但其实对语言内置类型或者指针调用也支持: template <class T> int compa ...
- C++中typename用法
typename用法: 1.在c++模板中,用于类型参数化的关键字 2.内嵌.依赖类型名 注:C++11中, typename用于指明紧跟其后的是个类型 1. 在C++中typename一般用来声明模 ...
- 模板编程中typename用法
模板编程中typename用法 文章目录 模板编程中typename用法 typename的常规用法 typename的第二个用法:修饰类型 typename使用规则 typename的常规用法 ty ...
- C++ 中 typename用法
1.typename的常规用法 typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数: 2.typename的第二个用法:模板中标明"内嵌 ...
- typename用法
转自百度百科 class关键字的同义词 这是一项C++编程语言的泛型编程(或模板编程)的功能,typename关键字用于引入一个模板参数,例如: // 定义一个返回参数中较大者的通用函数 templa ...
- typedef 与 typename 的用法
一.typedef:类型说明 类型说明的格式为: typedef 类型 新定义名: 类型说明只定义指定的一个类型的新名字,并不是定义一种新的数据类型. eg: typedef int INT; 这样声 ...
- 最好的 C++ 模板元编程干货!
链接 | https://www.cnblogs.com/liangliangh/p/4219879.html 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能 ...
- C++ typename的起源与用法
目录 起因 typename的常见用法 typename的来源 一些关键概念 限定名和非限定名 依赖名和非依赖名 类作用域 引入typename的真实原因 一个例子 问题浮现 千呼万唤始出来 不同编译 ...
- typename的起源与用法
typename的起源与用法 侯捷在Effective C++的中文版译序中提到: C++的难学,还在于它提供了四种不同(但相辅相成)的程序设计思维模式:procedural-based, objec ...
最新文章
- 在MySQL和PostgreSQL之外,为什么阿里要研发HybridDB数据库?
- php或js判断网站访问者来自手机或者pc端源码
- Qt Creator创建一个移动应用程序
- autoLayout自动布局
- vue 单独页面定时器 离开页面销毁定时器
- mysql mongodb binlog_订阅MongoDB的数据变更比解析mysql的binlog更简单
- 接口implements(Java)
- 2021 互联网公司时薪排行榜出炉!多多排榜首!微软、美团很强!
- 浅析busybox如何集成到openwrt
- 妙盈科技:ESG数据提供商获融资
- 基于IDEA 最新Spirng3.2+hibernate4+struts2.3 全注解配置 登录
- 苹果Mac怎样切换大写输入法?
- 1147 Heaps (30 分)
- grunt html模块化管理插件,grunt模块化配置
- html css jsp 数据库,html、css、js、jsp的区别是什么?
- linux系统有什么用
- like to do 和like doing的区别
- 怎么用手机修改服务器的网关,网关,详细教您手机怎么改网关和IP
- 【微博技巧】绕开微博绑定手机注册微博
- 创始人退休后的Python,起飞还是没落?
热门文章
- 【安全知识分享】全员安全法律法规专项培训143页.pptx(附下载)
- java pdf生成图片水印 itext
- 微信突然迎来重大更新!这波新功能把我看傻了
- 二十世纪计算机技术逐渐发展起来,机电一体化在建筑智能化工程中的技术分析及应用...
- 数据科学库学习第一节
- 在线考试例子(vant+vue)
- SLAM十四讲:第三讲习题
- 用手机开直播需要买些什么样的直播设备?
- day04【JS高级】BOM对象、Window对象、二种定时器、 Location对象、DOM对象、DOM获取元素、DOM操作内容、DOM操作属性、DOM操作样式、DOM操作元素(标签)、 正则表达式
- 23种设计模式的简单介绍