转自百度百科

class关键字的同义词

这是一项C++编程语言的泛型编程(或模板编程)的功能,typename关键字用于引入一个模板参数,例如:

// 定义一个返回参数中较大者的通用函数
template <typename T>
const T& max(const T& x, const T& y)
{return x > y ? x : y;
}

这种情况下,typename可用另一个等效的关键字class代替,如下代码片段所示:

// 定义一个返回参数中较大者的通用函数
template <class T>
const T& max(const T& x, const T& y)
{return x > y ? x : y;
}

以上两段代码没有功能上的区别。

类型名指示符

template <class T>
void foo(const T& t)
{// 声明一个指向某个类型为T::bar的对象的指针T::bar * p;
}struct StructWithBarAsType
{typedef int bar;
}; int main()
{StructWithBarAsType x;foo(x);
}

这段代码看起来能通过编译,但是事实上这段代码并不正确。因为编译器并不知道T::bar究竟是一个类型的名字还是一个某个变量的名字。究其根本,造成这种歧义的原因在于,编译器不明白T::bar到底是不是“模板参数的非独立名字”,简称“非独立名字”。注意,任何含有名为“bar”的项的类T,都可以被当作模板参数传入foo()函数,包括typedef类型、枚举类型或者变量等。

出现上述歧义时,编译器将自动默认bar为一个变量名,而不是类型名。所以上面例子中的代码 T::bar * p 会被解释为乘法,而不是声明p为指向T::bar类型的对象的指针。

如果还有另一个名为StructWithBarAsValue类型,如下:

struct StructWithBarAsValue
{int bar;
};

那么,编译器将以完全不同的方式来解释 T::bar * p 的含义。

解决问题的最终办法,就是显式地告诉编译器,T::bar是一个类型名。这就必须用typename关键字,例如:

template <typename T>
void foo(const T& t)
{   // 声明一个指向某个类型为T::bar的对象的指针typename T::bar * p;
}

这样,编译器就确定了T::bar是一个类型名,p也就自然地被解释为指向T::bar类型的对象的指针了

typename用法相关推荐

  1. C++(八)——typename用法

    1.typename来源 1.1原因1: 从表面上看,下面模板的参数只支持用户自定义类型,但其实对语言内置类型或者指针调用也支持: template <class T> int compa ...

  2. C++中typename用法

    typename用法: 1.在c++模板中,用于类型参数化的关键字 2.内嵌.依赖类型名 注:C++11中, typename用于指明紧跟其后的是个类型 1. 在C++中typename一般用来声明模 ...

  3. 模板编程中typename用法

    模板编程中typename用法 文章目录 模板编程中typename用法 typename的常规用法 typename的第二个用法:修饰类型 typename使用规则 typename的常规用法 ty ...

  4. C++ 中 typename用法

    1.typename的常规用法 typename在C++类模板或者函数模板中经常使用的关键字,此时作用和class相同,只是定义模板参数: 2.typename的第二个用法:模板中标明"内嵌 ...

  5. c++ typename用法

    1. //在C++中typename一般用来声明模板的模板参数(template parameter):    template<typename T> class X;   //T是一个 ...

  6. typedef 与 typename 的用法

    一.typedef:类型说明 类型说明的格式为: typedef 类型 新定义名: 类型说明只定义指定的一个类型的新名字,并不是定义一种新的数据类型. eg: typedef int INT; 这样声 ...

  7. 最好的 C++ 模板元编程干货!

    链接 | https://www.cnblogs.com/liangliangh/p/4219879.html 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能 ...

  8. C++ typename的起源与用法

    目录 起因 typename的常见用法 typename的来源 一些关键概念 限定名和非限定名 依赖名和非依赖名 类作用域 引入typename的真实原因 一个例子 问题浮现 千呼万唤始出来 不同编译 ...

  9. typename的起源与用法

    typename的起源与用法 侯捷在Effective C++的中文版译序中提到: C++的难学,还在于它提供了四种不同(但相辅相成)的程序设计思维模式:procedural-based, objec ...

最新文章

  1. 《自然》:修复AI神经网络的缺陷
  2. 安装python程序后要进行什么设置-安装好Pycharm后如何配置Python解释器简易教程...
  3. [导入]深入了解OpenOffice.org(二){作者:路广}
  4. 520,#爱 with AI#
  5. html入门学习(二)
  6. python大于小于1023python大于小于_PythonPAT 1023 Have Fun with Numbers
  7. Github 王炸功能!Copilot 替代打工人编程?
  8. 马桶怎么清洗才干净无异味?
  9. oracle rlw,Oracle数据库终于支持R语言 发力数据挖掘
  10. 反卷积(Deconvolution)、上采样(UNSampling)与上池化(UnPooling)加入自己的思考(pytorch函数)(二)
  11. 【洛谷】【堆+贪心】P1484 种树
  12. 26秒!全球销量第一的AI音箱就被腾讯黑掉了,然后变身窃听器
  13. 我的技术博客开通了!
  14. html选择符分几类,css的选择符有哪些?
  15. 深度学习图像识别笔记(二):红外图像
  16. 对有效性的认识(卓有成效的管理者)
  17. DosBox 的 DOSBOX.CONF 的详细配置说
  18. 学习嵌入式Linux开发——RK3288开发板学习规划及目标
  19. Altium Designer基础知识
  20. 近期微信登录10005报错,解决办法

热门文章

  1. 北达科他州证券监管机构针对3家ICO提出终止令
  2. ADC采样Q15归一化处理
  3. 新春全能手机必选项,荣耀10青春版成就品质生活!
  4. 人类最基本的思维方式有哪些?
  5. TLS/SSL加解密详解(一)
  6. 使用Google Elevation API获取海拔高度(java版)
  7. 中柏ezpad 7 BIOS刷错无法恢复的故障解决方案-亲测有效
  8. 2019.01.24【NOIP提高组】模拟 B 组
  9. 百度地图API申请流程
  10. 人脸特征点检测:VanillaCNN