C++泛型编程:typename和class关键字的区别

news/2024/6/19 6:24:56 标签: c++, 开发语言

在STL中基本上都使用了模板类的声明,即template。在模板类的声明中,有两种方式:

template <class T>

template <typename T>

这里,class和typename是相同的。

也就是说,在声明模板类型参数的时候,class和typename意味着 完全相同的东西。

Effective C++ 中建议我们尽量使用typename而不是class来声明一个模板。因为class给人的感觉总像是T应该是一个类,或者说是用户自定义的类型,而typename则更像是表明T可以是任意一种类型。虽然在C++编译器看来,这两种声明方式没有任何的区别,其意义是完全一样的。


但是,在C++中,有的时候必须要使用typename下面我们列举下面一个例子。关键字typename被用来作为类型之前的标识符号。

template <class T>

class MyClass {

    typename T::SubType * ptr; // 使用 T 的嵌套类型 SubType

};

在这个 MyClass 模板中,ptr 是一个指针,其类型为 T::SubType*。 ptr 指向的是 T 类型中定义的 SubType 类型的对象。

在模板定义中,编译器默认不知道 T::SubType 是一个类型还是一个成员变量,因为在模板实例化之前,T 是未知的。使用 typename 告诉编译器 T::SubType 是一个类型。如果省略 typename,编译器可能会因为不明确而报错。T可以 是某个具体的类,它内部定义了 SubType 类型。

如果要把一个template中的某个标识符号指定为一种类别,关键字typename不能省略

C++的一般规则是,除了使用typename修饰之外,template内的任何标识符号都被视为一个值而不是一个类别(对象)。

无论何时,如果使用了一个依赖与模板参数的类型时,就必须在整个名字前加上typename。


套类型是在一个类或结构体内部定义的类型。假设有一个类 A,在这个类内部,定义了另一个类 B 或者一个类型别名 B。这里的 B 就是一个嵌套在 A 内的类型,即 A 的嵌套类型。

class A {

public:

    class B { /*...*/ }; // B 是一个嵌套在 A 中的类

    typedef int C; // C 是一个嵌套在 A 中的类型别名,指向 int

};

在这个例子中,B 和 C 都是 A 的嵌套类型。

 


http://www.niftyadmin.cn/n/5368098.html

相关文章

CCF-CSP 202206-2 寻宝!大冒险!

CCF-CSP 202206-2 寻宝&#xff01;大冒险&#xff01; &#x1f638;题目要求&#x1f408;‍⬛题目背景&#x1f408;‍⬛问题描述&#x1f408;‍⬛输入格式&#x1f408;‍⬛输出格式&#x1f408;‍⬛样例说明&#x1f3b6;样例1输入&#x1f3b6;样例1输出&#x1f3b6;样…

jmeter二次开发函数-生成身份证号

代码参考这个 java 随机生成身份证代码 Java的身份证号码工具类 pom文件添加 <dependency><groupId>org.apache.jmeter</groupId><artifactId>ApacheJMeter_core</artifactId><version>5.4.1</version></dependency><d…

鸿蒙开发系列教程(十四)--组件导航:Tabs 导航

Tabs 导航 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏 每一个TabContent对应的内容需要有一个页签&#xff0c;可以通过TabContent的tabBar属性进行配置 设置多个内容时&#xff0c;需在Tabs…

详细关于如何解决mfc140.dll丢失的步骤,有效修复mfc140.dll文件丢失的问题。

mfc140.dll文件是Microsoft Visual Studio 2015程序集之一&#xff0c;它包含用于支持多种功能的代码和库。当这个mfc140.dll文件丢失时&#xff0c;可能会导致相关程序运行出错甚至无法运行。很多用户可能会遇到mfc140.dll丢失的问题&#xff0c;但是这并不是不可解决的困难。…

“探索AJAX:前端与后端数据交互的利器“

前言 在现代Web开发中&#xff0c;前端与后端之间的数据交互是一个至关重要的环节。为了实现无需刷新页面的动态更新&#xff0c;AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;作为一种强大的技术被广泛应用。 AJAX的原理 AJAX通过JavaScript和XMLHttpReque…

Vue3快速上手(二)VSCode官方推荐插件安装及配置

一、VSCode官方插件安装&#xff0c;如下图2款插件 在用vite创建的程序里&#xff0c;提示提安装推荐的插件了&#xff0c;如下图&#xff1a; 二、配置 在设置-扩展里找到Volar插件&#xff0c;将Dot Value勾选上。这样在ref()修改变量时&#xff0c;会自动填充.value,无需…

架构学习(五):scrapy实现自定义代理中间件

scrapy实现自定义代理中间件 前言关卡&#xff1a;实现自定义代理中间件代理中间件源码解析代理池自定义代理中间件 结束 前言 ip检测是比较常规的反爬手段&#xff0c;一般站点会限制ip的访问频率&#xff0c;或者根据ip的访问规律和频率来识别异常访问&#xff0c;从而点对点…

32DMA数据转运

目录 一.简介 二.DMA结构框图 三.测试 四.相关函数 五.代码实现 &#xff08;1&#xff09;存储器到存储器数据转运 (2)ADC单次扫描 &#xff08;3&#xff09;ADC连续扫描 一.简介 DMA外设是可以直接访问32内部的存储器的&#xff0c;包括运行内存SRAM&#xff0c;程序…