了解typename的双重定义

这里只说一个小坑 具体的typename使用方法和注意事项见Effective C++条款42

首先typenametemplate(泛型编程的定义)有众所周知的作用
这个作用和class是完全一样的

  • template<typename T>
  • template<class T>

不过这里就不细说这个点了啊

关于泛型编程时可能会遇到的一个问题
就是我们在编写函数或者定义变量时,可能需要引用到泛型类里的自定义数据类型
比如说:

template<class T>
class A{class B{};
};// 错误的写法!!!
template <class T>
void test(A<T> &a){A<T>::B b=a.B;int n;
}

当需要定义B的类型时如果直接是 A<T>::B 是不可编译的
需要在前面加上typename这是C++编译器的一种规则

原理

对于上方的test函数,我们对其做一些专业术语介绍
首先a是类型A<T>我们称之为从属名称(dependent name),因为他的类型依附于某个template参数
而b是类型A<T>::B的,虽然上面书写方式是错误的,b我们称之为嵌套从属名称(nested dependent type name)
而n是int的,根据上面的方式,我们称之为非从属名称(non-dependent name),为不是独立名称(independent name),没有为什么,已经是行业类的术语了

之所以会出现这种情况是比如我们书写这样一条语句
A<T>::B* b;
我们的本意是实例化一个A<T>::B类型
但是编译器不知道我们的A<T>::B是一个数据类型
如果我们在A的类里定义了一个static的变量也叫B呢,这样也还好,编译器还会报错,但是如果我们有一个golbal(全局)变量也叫b呢
那这条语句就会被认为是A类中的static变量B与golbal变量b相乘

所以为了不混淆,C++在编译时有了这样一个规则
如果解析器在template中遭遇到一个嵌套从属名称,它便假设这个名称不是个类型,除非我们告诉它,但这也有类外

template<class T>
class C::A<T>::B{    //base class list中不允许使用"typename"explicit C(int x):A<T>::B(x){    //mem init list中不允许使用"typename"typename A<T>::B temp;  //除了上面两种情况,其他情况都需要加上"typename"}
}

了解typename的双重定义相关推荐

  1. C++ typename 的双重含义

    1.模板类型参数申明 使用模板时,在申明模板类型参数时,我们经常有如下两种申明方式: // 方式一 template <class T> CTest;// 方式二 template < ...

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

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

  3. typename的双重语义

    1在定义模板函数和模板类时class和typename的效果一样的 //以下效果一样 //template<class T> template<typename T> clas ...

  4. C/C++编程:了解typename的双重意义

    问题:在下面模板声明式中,class和typename有什么不同? 回答:没有什么不同.当我们声明模板类型参数,class和typename的意义完全相同. 然而,C++并不总是把class和type ...

  5. template类的typename详解--龙之介《Effective C++》实验室

    条款typename的双重定义 声明关键字class和typename可互换 假设你这样声明一个迭代器 C::const_iterator iter(container.begin()); 这将不是一 ...

  6. 《Effective C++》读书笔记(第二部分)

    6. 继承与面向对象设计(Inheritance and Object-Oriented Design) 条款32: 确定你的public 继承塑模出is-a 关系 本条款告诉读者一个非常基本的继承思 ...

  7. 《Effective C++》笔记

    <Effective C++>笔记 序言 条款01:视C++为一个语言联邦 条款02:尽量以const.enum.inline替换#define 条款03:尽可能使用const 条款04: ...

  8. Effective C++:改善程序与设计的55个具体做法

    Effective C++:改善程序与设计的55个具体做法 二.构造/析构/赋值运算 05 Know what functions C++ silently writes and calls. 06 ...

  9. 模板与泛型编程知识点:编译期多态、typename标识嵌套从属类型名称

    1.隐式接口与编译期多态: 显式接口:一般类成员函数定义的接口. 隐式接口:模板函数/类中定义的函数,由于参数类型.返回类型可能不定,因此为隐式接口. 运行时多态:virtual函数引出的多态行为. ...

最新文章

  1. 虚函数表剖析,网上转的,呵呵
  2. 《智源社区周刊:预训练模型》第2期:Facebook用“预微调”改进预训练性能、再议GPT-3中的东方主义偏见...
  3. RIA Service 的 SOAP EndPoint
  4. PHP+mysql+ajax搭建图书管理系统
  5. Function types cannot have argument labels 错误解决方案
  6. 文件表单带数据一起提交spring_基于 Spring 实现管道模式的最佳实践
  7. 204. Count Primes
  8. C# 入门之 Hello World
  9. 打印设置自定义表尾_如何自定义凭证汇总表打印页面设置
  10. apache shiro怎么升级_Spring Boot 整合 Shiro ,两种方式全总结!
  11. 【机器学习】Andrew Ng——03线性代数知识回顾
  12. java商品名称_Java统计商品信息
  13. Android Studio + TensorFlow lite 0.1.7
  14. mcgs 安装没有权限_我的电脑为什么不能安装mcgs组态软件
  15. 两矩阵相乘的秩的性质_矩阵分析与应用(一,矩阵基础知识)
  16. 推出 2020 年图像匹配基准和挑战赛
  17. 网络系统实现技术--AppleTalk
  18. 一次手机木马的清除记录(手机刷机)
  19. 自动驾驶和辅助驾驶基础知识
  20. 《出版专业实务》(2015年版初级)思考与练习答案 第三章

热门文章

  1. 第一节 树莓派开发准备工作
  2. 树莓派学习笔记(五)串口通信
  3. fatal error:Killed signal terminated program cc1plus错误解决方法
  4. http-一次完整的HTTP请求过程-六个阶段
  5. 成立十年之后,集团化的途牛将业务分拆为旅游度假和金融科技
  6. 安卓强制恢复出厂_删文件、恢复出厂设置都没辙,安卓木马病毒xHelper该如何清除?...
  7. Hadoop学习_mapreduce提交方式+实现简单流量统计程序(有注释)+shuffle
  8. 两线怎么接三线插座图_两根线怎么接三孔插座,应注意什么
  9. AppStore 定价策略
  10. 关于mediaplay的程序