typename的两种用法

news2024/11/23 15:05:16

typename有两种用法,第一种用于声明模板时,表示模板类型参数,如下所示。在用于模板声明时,typename 和 class 等价,具有同等含义。

template<typename T> class MyClass;
// 等价于
template<class T> class MyClass;

typename的第二种用法,用于表示一个类内所指的类型为一个 “class” 类型(内置类型、自定类型),而非其他(变量、函数类型)。更一般的说法是,typename 用来告诉编译器类中的嵌套名称表示的是一个类型。看下面一个例子。

class MyCls {
public:
    using value = int;
};

template<typename T>
void func(T t)
{
    typename T::value v = 10;
    std::cout << v << std::endl;
}

void test_MyCls()
{
    MyCls m;
    func(m);
}

int main()
{
    test_MyCls();
}

我的编译环境为: Ubuntu 20.04 + g++ (GCC) 11.3.0。编译上述代码,能正确编译通过。
在这里插入图片描述
若将 func 中的 typename 关键字去掉,则会编译失败,编译结果如下所示:
在这里插入图片描述

编译报错的主要原因是,在模板实例化的过程中,T::value 没有被解析为一个类型,如编译结果中红色圈出的部分所示。但可能会存在这样一种疑问,在上面的示例中,模板参数T在模板实例化的过程中解析为 MyCls,而 MyCls::value 在 MyCls 中被声明为 int 的别名,因此 T::value 被实例化为 MyCls::value 后表示的应该就是一个类型。这样直觉的理解看似没问题,但违反了C++中的模板解析规则。在模板实例化之前,会先对语法进行解析,当解析到 T::value 时,T还没被实例化为一个具体的类型,因此 T::value 可能表示的是一个类型,也可能表示的是一个 static 变量,也可能是一个全局的变量,因此 T::value 就存在了歧义,因此编译器编译不通过。为了解决这种起义,C++中规定,当使用类中的嵌套类型时,需要使用 typename 进行声明。


在 《Effective C++》的条款42中,对类中的嵌套类型的描述摘录如下。

template 内出现的名称如果相依于某个template参数,称之为从属名称(dependent names)。如果从属名称在 class 内呈嵌套状,我们称它为从属嵌套名称(nested dependent name)。

因此有了规则 “typename 必须作为嵌套从属类型名称的前缀词”。

“typename 必须作为嵌套从属类型名称的前缀词” 这一规则的例外是,typename 不可以出现在 base classes list 内的嵌套从属名称之前,也不可以在 member initialization list 中作为 base class 修饰符。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1307398.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从零开始学机器学习,这些学习网站让你事半功倍!

介绍&#xff1a;机器学习是人工智能&#xff08;AI&#xff09;和计算机科学的一个分支&#xff0c;它专注于使用数据和算法&#xff0c;模仿人类学习的方式&#xff0c;逐步提高自身的准确性。更具体来说&#xff0c;机器学习是一门关于数据学习的科学技术&#xff0c;它能帮…

Postswigger 靶场 XSS 通关

文章目录 PostSwigger靶场XSS通关学徒&#xff1a;第一关学徒&#xff1a;第二关学徒&#xff1a;第三关学徒&#xff1a;第四关学徒&#xff1a;第五关学徒&#xff1a;第六关学徒&#xff1a;第七关学徒&#xff1a;第八关学徒&#xff1a;第九关 PostSwigger靶场XSS通关 靶…

VCSA7.0加入Windows AD域失败的处理过程

一、问题现象 vcsa7.0加入AD域时提示“Idm client exception: Error trying to join AD, error code 2453” 二、处理过程 &#xff08;一&#xff09;检查是否DNS问题 查看dns是否设置正确&#xff0c;如下&#xff1a; 1. Enable SSH on VCSA. 2. Command> shell 3…

高质量渲染效果的硬件要求!云渲染效果的作用优势

​在数字内容创作的世界里&#xff0c;渲染技术始终是提高视觉效果和最终产物质量的关键环节。无论是影视制作、游戏开发还是建筑可视化&#xff0c;高品质的渲染结果对于传达设计理念和吸引观众都至关重要。本文将讨论实现这些高质量渲染效果所需的硬件要求&#xff0c;探讨CP…

程序中关于时间和比较运算符的单词

时间 在日志中&#xff0c;我们经常碰到关于一些时间的单词缩写 比如这个Fri Dec 1 就代表了Friday &#xff08;星期五&#xff09;&#xff0c; December &#xff08;十二月&#xff09; 12月1日星期五 或者使用date查看时间的时候 dateWed Dec 13 05:55:54 PM CST 2023这…

【Hive】——DDL(CREATE TABLE)

1 CREATE TABLE 建表语法 2 Hive 数据类型 2.1 原生数据类型 2.2 复杂数据类型 2.3 Hive 隐式转换 2.4 Hive 显式转换 2.5 注意 3 SerDe机制 3.1 读写文件机制 3.2 SerDe相关语法 3.2.1 指定序列化类&#xff08;ROW FORMAT SERDE ‘’&#xff09; 3.2.2 指定分隔符&#xff0…

Shopee电商平台:跨境电商的领先者

Shopee是一家领先的跨境电商平台&#xff0c;由新加坡互联网公司Sea Group于2015年创立。自成立以来&#xff0c;Shopee凭借其强大的物流网络、安全快捷的收款方式、本地化的客服团队以及丰富的活动资源&#xff0c;赢得了全球用户的喜爱和信赖。本文将全面介绍Shopee的特点和优…

数据库运行sql文件,数据传输报错

这是什么原因啊&#xff01;太难弄了 my.cnf在/etc/my.cnf中进行设置 #最大连接数 max_connections200 #编码 character-set-serverutf8default-storage-engineINNODBsql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES[mysql] #编码 default-character-setutf8

当大语言模型遇见广告:新变革还是新泡沫?

人工智能可能从未受到过如此之高的关注度。 2022年11月30日&#xff0c;OpenAI正式发布了ChatGPT&#xff0c;它是一款基于GPT3.5架构 1 进行训练的人工智能聊天机械人。ChatGPT像是一个全能的人&#xff0c;无论是有关文化、历史、艺术还是科技和商业的问题&#xff0c;它都能…

Tomcat主配置文件(server.xml)详解

前言 Tomcat主配置文件&#xff08;server.xml&#xff09;是Tomcat服务器的主要配置文件&#xff0c;文件位置在conf目录下&#xff0c;它包含了Tomcat的全局配置信息&#xff0c;包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…

Day35 贪心算法 part04

Day35 贪心算法 part04 860.柠檬水找零 pass 406.根据身高重建队列 pass

Yolov5双目测距-双目相机计数及测距教程(附代码)

引言 在计算机视觉领域&#xff0c;Yolov5-Binocular相机距离计数及测距是一个引人注目的研究方向。本教程将为小白用户提供一个简明扼要的学习指南&#xff0c;涵盖了关键步骤&#xff0c;包括标定、公示推倒以及重要的代码片段。 第一步&#xff1a;环境搭建 首先&#x…

vue3+element-plus, 设置table表格滚动到最底部

当table设置heigh属性时&#xff0c; 希望表格添加行数时&#xff0c;能显示最后底部数据&#xff08;即表格滚动条&#xff0c;滚动到最底部&#xff09;解决方法 const tableListRef ref();let table tableListRef.value.layout.table.refs; // 获取表格滚动元素 let tab…

k8s集群部分使用gpu资源的pod出现UnexpectedAdmissionError问题

记录一次排查UnexpectedAdmissionError问题的过程 1. 问题 环境 3master节点N个GPU节点 kubelet版本&#xff1a;v1.19.4 kubernetes版本&#xff1a;v1.19.4 生产环境K8S集群&#xff0c;莫名其妙的出现大量UnexpectedAdmissionError状态的Pod&#xff0c;导致部分任务执…

Playwright 常用元素定位方式(基础版)

Playwright 常用元素定位方式&#xff08;基础版&#xff09; 一、get_by_XXXXX get_by_role&#xff1a;根据元素角色进行定位, 常用的参数有两个&#xff0c;第一个是角色名称 role&#xff0c;第二个是元素的文本 name。其他参数的解释大家可以参考源码注释。 # 获取页面…

【数组Array】力扣-344 反转字符串

目录 题目描述 解题过程 题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 示例 1&#xff1a; 输入&a…

如何使用Docker将.Net6项目部署到Linux服务器(一)

目录 配置服务器环境 配置yum 配置docker 安装.NetCore SDK6.0 发布Net6 添加Dockerfile。 发布文件。 编辑DockerFile文件 ​编辑 上传文件 安装MySql 配置服务器环境 配置yum 在配置yum之前&#xff0c;我们需要先了解yum是什么&#xff0c;yum&#xff0c;是Yellow…

EMQX windows 安装与使用

EMQX 下载地址&#xff1a; 下载 EMQX 或者&#xff08;链接&#xff1a;https://pan.baidu.com/s/1Bn4aPoBOCRyM3bRnvpozUw 提取码&#xff1a;wo9t&#xff09; 文档地址&#xff1a;认证 | EMQX 文档 直接解压缩&#xff0c;然后在CMD cd 到 bin 目录下 输入 emqx star…

【OS】操作系统总复习笔记

操作系统总复习 文章目录 操作系统总复习一、考试题型1. 论述分析题2. 计算题3. 应用题 二、操作系统引论&#xff08;第1章&#xff09;2.1 操作系统的发展过程2.2 操作系统定义2.3 操作系统的基本特性2.3.1 并发2.3.2 共享2.3.3 虚拟2.3.4 异步 2.4 OS的功能2.5 OS结构2.5 习…

JS基础源码之手写模拟new

JS基础源码之手写模拟new 手写模拟new初步实现最终实现 手写模拟new new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象类型之一。 我们先看看new实现了哪些功能&#xff1a; function Person (name,age){this.name name;this.age age;this.habit Games;…