了解 C++ 之 typename
typename与class都可以用作模板形参定义的关键字,两者无异~~
可是,typename的用途并非仅限于此,如下面的代码:
templatevoid print(const C & container)
{
C::const_iterator iter(container.begin());
cout << *iter << endl;
int value = *iter;
return;
}
更正:上述模板参数应该为C!!!!
在上述代码中,iter的类型是C::const_iterator,实际的类型取决于C的类型。const_iterator 同时也是C内部的typedef 类型名。 但是,在此处,编译器的行为不会是你预期的。
为了说明这个问题,定义两个概念,一个是从属名称,一个是非从属名称。
在上述代码中,iter 是依赖于模板参数C的,因此被称为从属名称;
同理,value是内置类型,不依赖于任何模板参数,因此被称为 非从属名称。
C++编译器在面对从属名称时,如果此时该从属名称又嵌套了其他类型,如此处的 iter就是C::const_iterator类型,
这里的C::const_iterator 称为嵌套从属类型(嵌套于C类型,从属于模板参数C)。编译器在看到这样的代码
时,难免会晕头转向,因为它不知道const_iterator 是C内部定义的类型,还是C内部的成员变量。因此,编译器一致
约定说,对于这样的不负责任的输入,编译器一致将其认为 “这不是个类型”!!显然这就需要在代码中明确地告诉
它,这是个类型,就这样只需要 在 C::const_iterator 前面加上关键字 typename 即可。
这就是必须用到typename的地方。告诉编译器,明确代码的含义,如果觉得很难记住,记住下面这一个例子就可以了:
template <class T> //可以是class或者是typename,定义模板
void f( const C & container , typename C::iterator iter); // 第一个参数不需要typename,因为它并没有设计嵌套从属类型,它只是个从属类型(因为与C相关), 后面的typename是必须的。
但是,这里似乎有一些恼人的情况,前面提到说,在嵌套从属类型之前,你需要明确的告诉编译器,你需要的是个类型,可是有些
时候,又不能这么做。
比如下面的情况:
1 在类定义的基类列表中出现的嵌套从属类型之前,不能写typename。
2 在成员初值列表中,不能使用typename。
例如下面的例子:
templateclass Derived : public Base::Nested
{
public:
explicit Deirved(int x) : Base::Nested(x)
{
typename Base::Nested temp;
....
}
};
总之:
在template声明时,class与typename是等价的。
typename则用在嵌套从属类型定义时,除了在成员初值列以及基类列表中。
了解 C++ 之 typename相关推荐
- C++中模板template typename T
template <typename Dtype>. 网上解释的非常多,觉得比较啰嗦,其实就是一个类型模板. 比如我们要计算两个数的加法,针对不同类型可能需要设计不同类型的函数,那么tem ...
- C++报错解决:error: ‘int’ is not a class, struct, or union type typedef typename _Sequence::value_
我在使用C++的时候,遇到了如下报错: -> % g++ test.cpp In file included from /usr/include/c++/7/queue:64:0,from te ...
- 转载模板声明中template typename T和template class T
原文地址http://blog.csdn.net/bug07250432/article/details/10150625 在c++Template中很多地方都用到了typename与class这两个 ...
- C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员
一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...
- C++ STL中常见的typename关键字的作用
在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于 ...
- 类型名称了解typename的双重意义
这段时间一直在查找类型名称之类的问题,今天正好有机会和大家共享一下. 先来看上面一个问题: 在template声明中,使用class和typename有什么不同? template<class ...
- opencv C++ 三重for循环遍历RGB图像像素(逐像素操作、操作像素值、遍历像素遍历)at<typename>(i,j)、灰度图at<uchar>、at<Vec3b>、at<Vec3F>
示例:数组遍历法at<typename>(i,j) -- 其中一种方法(速度可能并不是很快),如果对速度有要求可查看参考文章2里的其他方法 #include <opencv2/ope ...
- 使用Template时 typename 关键字的用法
以下面这个简单的程序为例 #include <iostream>template<class CONTAINER> struct EST_TTI_Entry {float t; ...
- 【C++】typename
参考<Effective C++>条款42:Understand the two meaning of typename Table of Contents 1 模板参数列表中与class ...
- C++之typename
1.typename和class 在模板前,typename和class没有区别 template<typename T> class A; template<class T> ...
最新文章
- php验证 js验证邮箱格式,js和php邮箱地址验证的实现方法
- Lambda 表达式有何用处?
- PC微信逆向:分析通用设置数组
- UNITY statistic中的 SetPass和Batches
- AcWing 1015. 摘花生 (DP)
- 理解GetHashCode()的缺陷
- \t\t中国历代皇帝列表,中国皇帝列表,中国历代时间表,中国各朝代列表
- 基于Ubuntu 18.04打造嵌入式arm开发环境
- DBC文件解析,基于致远电子DBC_demo
- 如何招聘软件测试,ÈçºÎÕÐƸµ½µÄÈí¼þ²âÊÔ¹¤³Ìʦ£¿
- 如何解压war后缀的文件:
- 大尺度衰落与小尺度衰落
- yum安装软件时,出现“No package XXX available“的解决办法
- c语言中十六进制乘以16啥意思,C语言16进制中16怎么表示?
- 关于“24点”游戏的解法
- linux下TSL如何升级,glibc升级
- html怎么帮图片占位,html占位图img placeholder
- [881]内存不足RuntimeError: CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 2.00 GiB total cap...
- 网站域名301重定向到带www网址的几种有效方式
- springboot系列(十四):如何实现发送图片、doc文档等附件邮件?你一定得会|超级详细,建议收藏
热门文章
- centos挂载u盘只读_解决CentOS自动挂载U盘/SD Card被识别为只读文件系统
- error C2041: illegal digit ‘9‘ for base ‘8‘ | error C2059: syntax error: ‘bad suffix on number‘
- 逻辑运算符 与、或、非
- android锁定屏幕通知_如何在Android锁定屏幕上隐藏敏感通知
- 网络交互实验实验总结
- axios 请求拦截器响应拦截器
- android-极限测试-话机存储空间极限测试(bat脚本)
- ASIL-汽车安全完整性等级
- PDC钻头刀翼的设计方法
- for…in循环语句应用