模板编程中typename用法
模板编程中typename用法
文章目录
- 模板编程中typename用法
- typename的常规用法
- typename的第二个用法:修饰类型
- typename使用规则
typename的常规用法
typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数;在下面的例子中,该函数实现泛型交换数据,即交换两个数据的内容,数据的类型由_Tp决定。
template <typename _Tp>
inline void swap(_Tp& __a, _Tp& __b)
{_Tp __tmp = __a;__a = __b;__b = __tmp;
}
typename的第二个用法:修饰类型
限定名和非限定名
限定名(qualified name),是限定了命名空间的名称。看下面这段代码,cout和endl是在命名空间std定义的,必须加上std::,使其为std::cout和std::endl,因此称其为限定名。
#include <iostream>int main()
{std::cout << "Hello world!" << std::endl;
}
若在主函数前面使用using namespace std;或者在主函数内使用using std::cout;,然后使用时只用cout和endl,它们的前面不再有空间限定std::,所以此时的cout和endl叫做非限定名(unqualified name)。
#include <iostream>
using namespace std;int main()
{using std::cout;using std::endl;cout << "Hello world!" << endl;
}
依赖名和非依赖名
依赖名(dependent name)是指依赖于模板参数的名称,而非依赖名(non-dependent name)则相反,指不依赖于模板参数的名称。看下面这段代码:
template <class T>
class MyClass
{int i;vector<int> vi;vector<int>::iterator vitr;T t;vector<T> vt;vector<T>::iterator viter;};
因为int是内置类型,前三个定义的类型在声明这个模板类时就已知,叫做非依赖名。然而对于接下来的三行定义,只有在模板实例化时才能知道它们的类型,因为它们都依赖于模板参数T。则T, vector<T>
, vector<T>::iterator
称为依赖名。
类作用域
在类外部访问类中的名称时,可以使用类作用域操作符,调用通常存在三种:静态数据成员、静态成员函数和嵌套类型:Metadata::value,Metadata::function,Metadata::ValueType;
class Metadata {static int value;static int function();typedef std::string ValueType;};
下面来看一个例子:
template <class T>
void function()
{T::iterator *iter;.....
}
我们可能本意是想定义一个迭代器对象,例如我们如果用vector来实例化这个模板,那么iter
则应该是一个迭代器指针,但是,如果我们用下面这个类来实例化这个模板
class cType
{static int iterator;...
};/*
T::iterator *iter会被编译器解释为两个数相乘。事实上,C++编译器会采用第二种解释方法,即使iterator的确是一个类型名。
为了避免这种矛盾,当我们适用qualified dependent name的时候,需要用typename来指出这是一个类型名.即: typename T::iterator *iter;
typename 指出下面紧跟着的名称是一个类型
*/
template <typename T> class Y
{typename T::iterator *iter;typedef typename T::iterator iterator; //定义了Y::iterator类型名称...
};
T::iterator这种名称,由于iterator具体是类型还是成员变量取决于T的类型实现,所以当我们知道T::iterator是个类型名称时,如果我们要使用这个类型名,前面必须要加typename.
typename使用规则
typename在下面情况下禁止使用:
- 模板定义之外,即typename只能用于模板的定义中
- 非限定类型,比如int,
vector<int>
之类 - 基类列表中,比如
template <class T> class C1 : T::InterType
不能在T::InterType前面加typename - 构造函数的初始化列表中,如果类型是依赖于模板参数的限定名,那么在它之前必须加typename(除非是基类列表,或者在类的初始化成员列表中)。
模板编程中typename用法相关推荐
- C++中typename用法
typename用法: 1.在c++模板中,用于类型参数化的关键字 2.内嵌.依赖类型名 注:C++11中, typename用于指明紧跟其后的是个类型 1. 在C++中typename一般用来声明模 ...
- 模板类中 typename的用法,以及函数的定义和声明
typename 的用法: 第一种 template<typename T> 这种大家都知道, 和 template<class T> 一样,就不多讲解了 第二种: 嵌套从属名 ...
- C++ 中 typename用法
1.typename的常规用法 typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数: 2.typename的第二个用法:模板中标明"内嵌 ...
- shell编程中date用法(转)
原文地址:http://blog.sina.com.cn/s/blog_61c006ea0100mgxe.html 1.date --help %% 输出%符号 a literal % %a 当前域的 ...
- python3网络编程中semaphore用法_python3 进程信号量semaphore
#-*- coding: utf-8 -*- importosimporttimefrom multiprocessing importPooldefgo_ktv(i):print("use ...
- shell编程中crontab用法超级详解!
使用crontab你可以在指定的时间执行一个shell脚本或者一系列Linux命令. 时间格式:{minute} {hour} {day-of-month} {month} {day-of-week} ...
- C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员
一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...
- android焦点动画,Android编程中PopupWindow的用法分析【位置、动画、焦点】
本文实例讲述了Android编程中popupwindow用法.分享给大家供大家参考,具体如下: 在Android中有很多级别的Window,不同级别的Window按照z-index方向分布.下面看看A ...
- java编程里的values怎么使用,详解Java编程中super关键字的用法
这篇文章主要介绍了Java编程中this与super关键字的用法,包括从内存结构方面分析super的作用域,需要的朋友可以参考下 通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程 ...
最新文章
- RHEL6基础四十三之RHEL文件共享②Samba简介
- python dictwriter_手把手教你写爬虫 |Python 采集大众点评数据采集实战
- 关于vue.js element ui 表单验证 this.$refs[formName].validate()的问题
- 【图解】java8性能对比_Java 11 究竟比 8 快了多少?
- EntityFramwork(1) 源地址https://msdn.microsoft.com/zh-cn/data/jj193542
- 基于Matlab的循环码实验报告,基于MATLAB的循环码实验报告
- 高端智能阿里手机 黑色 ZOPO C2 出售1499
- Boyer-Moore 投票算法
- linux设置开机自启 etc rt.d,Linux下禁止服务开机自启动
- JavaScript中__proto__与prototype的关系
- Atitit 短信验证的漏洞 目录 1.1. APP读取短信	1 1.2. 手机上访问的业务来说,短信验证码就没那么独立了	1 1.3. 短信保管箱”	1 1.4. 自动把短信备份到云端的功能。	2
- 一个正经的前端学习 开源 仓库(500)
- HUSTOJ随笔3-配置文件
- 单片机74LS138扩展中断
- 怎么样对阿里云ECS主机进行绑定域名
- 论证可行性有哪几个方面
- 达梦创建用户无效的用户名报错2101
- java组织机构代码验证规则
- 出租车GPS数据分析的常规方法
- 中国建筑装饰装修——刘昊威设计作品:切尔西·扬画廊
热门文章
- 英雄联盟手游测试服服务器维护中,英雄联盟手游再出问题,官方发布通告,这些玩家或将无缘测试服...
- 工业树莓派如何保障电气安全?
- html怎么把图片做成一条花纹,CSS3 花纹背景图
- postgresql: 求和后再求平均值
- 基于Android平台的简易计算器,基于Andriod的简易计算器
- Probase知识图谱详细介绍
- 计算机二级考试数据库,计算机二级数据库考试试题
- AppStore 定价策略
- html5三维空间效果,基于HTML5的空间环境数据三维成像研究与应用
- 2022-2027年中国蓝莓加工行业发展监测及投资战略咨询报告