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相关推荐

  1. C++中模板template typename T

    template <typename Dtype>. 网上解释的非常多,觉得比较啰嗦,其实就是一个类型模板. 比如我们要计算两个数的加法,针对不同类型可能需要设计不同类型的函数,那么tem ...

  2. 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 ...

  3. 转载模板声明中template typename T和template class T

    原文地址http://blog.csdn.net/bug07250432/article/details/10150625 在c++Template中很多地方都用到了typename与class这两个 ...

  4. C++知识点61——typename与class、模板编程与继承、模板类和友元、类模板与static成员

    一.typename与class的异同 1.啥时候既可以使用typename,又可以使用class? 当表示模板参数的时候,二者没有区别 2.啥时候只能使用typename,不能使用class? 当模 ...

  5. C++ STL中常见的typename关键字的作用

    在c++Template中很多地方都用到了typename与class这两个关键字,而且好像可以替换,是不是这两个关键字完全一样呢? 相信学习C++的人对class这个关键字都非常明白,class用于 ...

  6. 类型名称了解typename的双重意义

    这段时间一直在查找类型名称之类的问题,今天正好有机会和大家共享一下. 先来看上面一个问题: 在template声明中,使用class和typename有什么不同? template<class ...

  7. opencv C++ 三重for循环遍历RGB图像像素(逐像素操作、操作像素值、遍历像素遍历)at<typename>(i,j)、灰度图at<uchar>、at<Vec3b>、at<Vec3F>

    示例:数组遍历法at<typename>(i,j) -- 其中一种方法(速度可能并不是很快),如果对速度有要求可查看参考文章2里的其他方法 #include <opencv2/ope ...

  8. 使用Template时 typename 关键字的用法

    以下面这个简单的程序为例 #include <iostream>template<class CONTAINER> struct EST_TTI_Entry {float t; ...

  9. 【C++】typename

    参考<Effective C++>条款42:Understand the two meaning of typename Table of Contents 1 模板参数列表中与class ...

  10. C++之typename

    1.typename和class 在模板前,typename和class没有区别 template<typename T> class A; template<class T> ...

最新文章

  1. php验证 js验证邮箱格式,js和php邮箱地址验证的实现方法
  2. Lambda 表达式有何用处?
  3. PC微信逆向:分析通用设置数组
  4. UNITY statistic中的 SetPass和Batches
  5. AcWing 1015. 摘花生 (DP)
  6. 理解GetHashCode()的缺陷
  7. \t\t中国历代皇帝列表,中国皇帝列表,中国历代时间表,中国各朝代列表
  8. 基于Ubuntu 18.04打造嵌入式arm开发环境
  9. DBC文件解析,基于致远电子DBC_demo
  10. 如何招聘软件测试,ÈçºÎÕÐƸµ½µÄÈí¼þ²âÊÔ¹¤³Ìʦ£¿
  11. 如何解压war后缀的文件:
  12. 大尺度衰落与小尺度衰落
  13. yum安装软件时,出现“No package XXX available“的解决办法
  14. c语言中十六进制乘以16啥意思,C语言16进制中16怎么表示?
  15. 关于“24点”游戏的解法
  16. linux下TSL如何升级,glibc升级
  17. html怎么帮图片占位,html占位图img placeholder
  18. [881]内存不足RuntimeError: CUDA out of memory. Tried to allocate 16.00 MiB (GPU 0; 2.00 GiB total cap...
  19. 网站域名301重定向到带www网址的几种有效方式
  20. springboot系列(十四):如何实现发送图片、doc文档等附件邮件?你一定得会|超级详细,建议收藏

热门文章

  1. centos挂载u盘只读_解决CentOS自动挂载U盘/SD Card被识别为只读文件系统
  2. error C2041: illegal digit ‘9‘ for base ‘8‘ | error C2059: syntax error: ‘bad suffix on number‘
  3. 逻辑运算符 与、或、非
  4. android锁定屏幕通知_如何在Android锁定屏幕上隐藏敏感通知
  5. 网络交互实验实验总结
  6. axios 请求拦截器响应拦截器
  7. android-极限测试-话机存储空间极限测试(bat脚本)
  8. ASIL-汽车安全完整性等级
  9. PDC钻头刀翼的设计方法
  10. for…in循环语句应用