typename关键字:几乎令人忽略的typename
前言:
typename关键字是我们学习模板的时候,了解到的一个关键字。但在这几天之前,也仅仅是了解到有这个关键字,而几乎不用这个关键字。在个人看来,在template的参数中,由于class的存在这个简单的关键字,使typename变得有些暗淡。
而在这几天的一句代码中,才让我迫不及待的了解这个关键字。
这是一句什么代码呢?,让我们看正文!
typename关键字
typedef typename Hash::hash_iterator<K, std::pair<K, V>, MapKeyofT<K, V>,Ha> iterator;
在我不太了解typename关键字之前,也就是只知道在template参数中可以用typename,所以我写的代码是:
typedef Hash::hash_iterator<K, std::pair<K, V>, MapKeyofT<K, V>,Ha> iterator;
而这个时候,代码编译一直通不过 。
那么通不过的原因是什么呢?
在此之前我们需要了解一些概念。从属名称和非从属名称
//此处代码只是为了让大家了解概念
template <class T>
void vectorPrintf(vector<T>& arr)
{vector<T>::iterator it=arr.begin();while(it!=arr.end()){int x=*it;++it;cout<<x<<endl;}}
template内出现的名称如果依存于某一个template参数,称之为从属名称。
如果从属名称在class内称嵌套状,我们称它为嵌套从属名称
一个并不依赖任何template参数的名称,这样的名称就是非从属名称
it的类型是什么取决于template的参数T,则这就是一个从属名称,并且它还是一个嵌套名称。
x的类型为int,和template的参数没有任何关系,这就是一个非从属名称。
我们再了解概念之后,直接给出typename的用处:
typename 的用处:
- 用于声明template中的参数,从C++角度来看,无论使用typename还是class,意义都是相同的
- typename被用来验明嵌套从属类型名称,其他名称不需要有它
template<class C> //声明template的参数,template和class意义相同,看个人习惯选择使用
void Fun(C& container, //非嵌套从属类型名称,不需要使用typename
typename C::iterator it) //嵌套从属类型名称,一定要使用typename
用typename检验嵌套从属类型名称,这出于一种现状:嵌套名称有可能导致解析困难
C::iterator * x
我们看起来是申请了一个指针变量x 类型为C::iterator 。但是如果C中有个static变量命名为iterator,这句代码就和我们想的效果,相距十万八千里了,并且让我们感觉到这个世界太疯狂:两个变量进行相乘。
C++中有个规则,我们可以用这个理解一下,当解析器到这句代码的时候,不知道C::iterator是一个嵌套从属名称,怎么办呢?它就假设这不是一个类型,也就产生了我们刚才奇幻的一幕,被认为是两个变量相乘!而解决办法就是你告诉解析器这是一个嵌套从属名称,那么所遇到的问题也就迎刃而解了!
我们对于typename的认识到这里应该就完全OK了,但是这个世界总是有一些特别的事物,吸引着我们
请使用关键字typename表示嵌套从属类型名称;但不得在基类列表或者成员初始列表内以它作为基类的修饰符
template<class C> //声明template的参数,template和class意义相同,看个人习惯选择使用
class Derived : public Base<C>::xx //基类列表,不允许使用typename
{
Derived(int x)
: Base<C>::xx(x)
{
C& container //非嵌套从属类型名称,不需要使用typename
Base<C>::xx tmp //嵌套从属类型名称,一定要使用typename
}
}
让我们再次回顾一下typename
- 用于声明template中的参数,从C++角度来看,无论使用typename还是class,意义都是相同的
- 请使用关键字typename表示嵌套从属类型名称;但不得在基类列表或者成员初始列表内以它作为基类的修饰符
本文参考于Effective C++
注:如果本篇博客有任何错误和建议,欢迎伙伴们留言,你快说句话啊!
typename关键字:几乎令人忽略的typename相关推荐
- C++中typename关键字的使用方法和注意事项
目录 起因 typename的常见用法 typename的来源 一些关键概念 限定名和非限定名 依赖名和非依赖名 类作用域 引入typename的真实原因 一个例子 问题浮现 千呼万唤始出来 不同编译 ...
- C++ STL中常见的typename关键字的作用
在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于 ...
- typename关键字用法
阅读某开源代码,利用模板特新创建一个指针池时,对下面的两行代码产生了困惑 template<typename T> class NetPointerPool { public: typed ...
- 【C++模板】typename关键字的用法
目录 关键字typename 分析起源 场景分析 看看C++标准怎么说 typename在下面情况下禁止使用 关键字typename 作为一个C++程序员我想对于typename关键字都应该不陌生.不 ...
- typename关键字
深刻理解关键字typename用来标识是一个类型,详情见下面的例子 typename T::MyType m_c; 这里的typename表示T::MyType是一种类型,而不是某类 ...
- 使用Template时 typename 关键字的用法
以下面这个简单的程序为例 #include <iostream>template<class CONTAINER> struct EST_TTI_Entry {float t; ...
- C++ 类模板四(typename关键字)
转载于:https://www.cnblogs.com/zhanggaofeng/p/5665212.html
- 深入学习typedef和typename
1.类型定义typedef 类型说明的格式为: typedef 类型 定义名; 类型说明只定义了一个数据类型的新名字而不是定义一种新的数据类型.定义名表示这个类型的新名字. 例如: 用下面语句定义整 ...
- typename用法
转自百度百科 class关键字的同义词 这是一项C++编程语言的泛型编程(或模板编程)的功能,typename关键字用于引入一个模板参数,例如: // 定义一个返回参数中较大者的通用函数 templa ...
最新文章
- 一块GPU就能训练语义分割网络,百度PaddlePaddle是如何优化的?
- Apache+tomcat的整合
- shell中的算数运算
- 一文看懂 K8s 日志系统设计和实践
- 使用Signature Tool自动生成P/Invoke调用Windows API的C#函数声明
- 191. 位1的个数 golang
- oracle开启日志服务,Oralce 归档日志开启与关闭示例
- 用JAVA打开指定应用程序(软件),比如qq,浏览器
- android商品mysql_android使用mysql的方法总结
- python logging详解及自动添加上下文信息
- Unity3d 枚举某个目录下所有资源
- 一次redis乱用导致的事故现场
- IT桌面运维常识系列 - MDT
- 硬盘打不开了的修复方法?
- 对你来说,哪一个深度学习网络是最佳选择?(2)
- 狂神学习系列04:MySQL+JDBC
- 计算机怎样发现路由器上u盘,360 P2 无线路由器通过电脑终端查看路由USB存储设备操作流程 路由器...
- 5G/NR SSB与PRACH occasion如何关联?
- slambook2 ch3 Ubuntu18.04下运行和调试
- Yahoo Programming Contest 2019 D-Ears
热门文章
- cobol和java_现代化历险:策略+将COBOL转换为Java的示例
- 百无聊赖之JavaEE从入门到放弃(七)继承
- 组装电脑基础知识之显卡
- cad引线上下注记及左侧端点坐标提取
- 塔罗牌占卜源码(塔罗牌源码)占卜+爱情+预测+事业
- 详解C语言的编译与链接
- MMS多媒体短信技术简介
- Python当中大小写字母与数字的转换 chr()函数,ord()函数,以及ascii_lowercase和ascii_uppercase
- 微信小程序自学(五)-- 基础能力
- 从Autoencoder到VAE及其变体