模板中的依赖类型使用 --- typename

news2024/11/23 22:39:31

        依赖类型,顾名思义就是依赖于模板参数的类型,在使用这种类型时,必须使用 typename,否则编译器是无法知道是在使用类型,还是类的成员(因为类的静态成员的使用方法也是T::xxx,这跟某个类中的类型的使用方法是一样的)。

        下面看一下简单的例子:

#include <stdio.h>
#include <stdlib.h>

struct myData
{
    typedef unsigned int myType;
    myType mValue;

    myData()
    {
       mValue = 100; 
    }
};

template <typename T>
int func(const T &it)
{
    T::myType value = 200;
    return it.mValue - value;
}

int main()
{
    myData data;
    myData::myType ret = func(data);
    printf("ret = %d\n", ret);
}

在这个模板函数 func 中想要使用 myData::myType 这个类型来声明一个变量 value,这样编译会出现什么错误呢?

编译错误已经指明,需要使用 typename 来引用T::myType 这个类型,因为T是一个依赖作用域。假如不用 typename 也能编译成功的话,是不是就会产生歧义了?因为 T::myType 也可以表示为一个类的静态成员,所以 typename 是必要的。 所以要想使用依赖于模板参数的类型时,必须加上 typename,如:typename T::myType value = 200;

如《Effective STL》中的例子
 

template<typename C>
bool lastGreaterThanFirst(const C& container)
{
    if (container.empty()) return false;
    typename C::const_iterator begin(container, begin());
    typename C::const_ierator end(container.end());
    return *--end > *begin;
}

在这个例子里,局部变量begin和end的类型是C::const_iterator。const_iterator是依赖形式类型参数C的一种类型。因为C::const_iterator是一种依赖类型,你被要求在它之前放上 typename 这个词。(一些编译器错误地接受没有typename的代码,但这样的代码不可移植。)

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

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

相关文章

【EI会议信息】第二届航空航天与控制工程国际学术会议(ICoACE 2023)

2023 2nd International Conference on Aerospace and Control Engineering 第二届航空航天与控制工程国际学术会议(ICoACE 2023) 2023年第二届航空航天与控制工程国际学术会议&#xff08;ICoACE 2023&#xff09;将于2023年12月15-17日在江苏南京召开。ICoACE 2023会议主要…

【虚拟机】NAT 模式下访问外网

目录 一、NAT 模式的作用原理 二、配置 NAT 模式实现外网访问 1、配置NAT模式的网段 2、虚拟机选择 VMnet8 网卡 3、IP地址设为自动分配 一、NAT 模式的作用原理 NAT模式下&#xff0c;虚拟机的系统会把宿主机当作一个大路由器&#xff0c;发送的网络请求和数据都是先发给…

LongLoRA:超长上下文,大语言模型高效微调方法

麻省理工学院和香港中文大学联合发布了LongLoRA&#xff0c;这是一种全新的微调方法&#xff0c;可以增强大语言模型的上下文能力&#xff0c;而无需消耗大量算力资源。 通常&#xff0c;想增加大语言模型的上下文处理能力&#xff0c;需要更多的算力支持。例如&#xff0c;将…

借助PLC-Recorder,汇川中型PLC(AM、AC系列,CODESYS平台)2ms高速采集的方法

高速数据采集要保证速度&#xff0c;也要保证时刻的准确性。在windows系统里&#xff0c;时间稳定性是个很难的问题。如果PLC发送的数据里带有时间信息&#xff0c;则可以由PLC来保证采样周期的稳定性。 从V2.12版本开始&#xff0c;PLC-Recorder软件可以处理发送电文里的时间…

国庆出游远程实测:ToDesk 、TeamViewer、AnyDesk远程控制软件稳定性

ToDesk 、TeamViewer、AnyDesk远程控制软件稳定性 【前言】【实测软件】【测试环境】【实操体验】1. 软件安装2. 登录速度3. 文件传输4. 操作延迟5. 画面清晰度6. 安全防护 【本文小结】 【前言】 随着科技的不断发展&#xff0c;远程控制软件已成为我们生活中不可或缺的一部分…

数据结构-图-最短路径问题

最短路径问题 单源最短路径Dijkstra算法原理代码实现 Bellman-Ford算法原理代码实现SPFA优化SPFA代码实现 多元最短路径Floyd-Warshall算法原理代码实现 单源最短路径 &#x1f680;最短路径&#xff1a;从图G的某个顶点出发到达另一个顶点的最短路径&#xff0c;其中最短是指…

鼠标灵敏度怎么调?4个方法提高使用体验感!

“不知道怎么回事&#xff0c;我的鼠标反应很慢慢&#xff0c;有时候好像会有延迟。使用起来感觉特别不舒服。这个问题应该怎么解决呢&#xff1f;希望大家帮帮我&#xff01;” 在使用电脑的过程中&#xff0c;鼠标是很常用的一个工具。调整鼠标的灵敏度对电脑的使用体验会有显…

DBeaver 导出数据的问题 SQL 错误: jdbc 驱动内部错误 Java heap space

DBeaver 导出结果集 报错 具体操作如下&#xff1a; 网友给出的解决方案是 &#xff1a;调整java参数 dbeaver.ini -startup plugins/org.eclipse.equinox.launcher_1.6.400.v20210924-0641.jar --launcher.library plugins/org.eclipse.equinox.launcher.win32.win32.x86_6…

第八章 排序 九、归并排序

一、定义 把两个或多个有序的序列合并成一个有序序列 二、2路归并 三、归并排序 四、例子 1、首先将数组A复制一份到另一个B数组。 2、在定义三个指针分别指向A数组头部、中间、尾部。定义两个指针指向B数组的头部和中间。 3、然后比较B数组中头指针和中间指针的数字大小&a…

Dockerfile自定义容器

1、Dockerfile Dockerfile 是用于构建 Docker 镜像的文本文件&#xff0c;其中包含一系列的指令和配置&#xff0c;用于定义镜像的构建过程。通过 Dockerfile&#xff0c;你可以定义镜像的基础操作系统、依赖、环境设置、应用程序等信息&#xff0c;从而实现可复制、自动化的镜…

mmcv视频处理,如何遇到异常帧不中断

背景 mmcv读取视频帧如果遇到error&#xff0c;则会直接停止执行。但是&#xff0c;视频后面的内容有时候也十分重要&#xff0c;所以这个时候就需要一种方式可以继续处理后续帧。 处理方法 修改mmcv的VideoReader中的__next__函数&#xff0c;修改为如下&#xff1a; def _…

Django使用SMTP发送邮件教程

CONTENTS 1. SMTP介绍2. 申请邮箱授权码3. Django发送邮件 1. SMTP介绍 SMTP&#xff08;Simple Mail Transfer Protocol&#xff09;即简单邮件传输协议&#xff0c;它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。SMTP 协议属于 TCP/I…

fiddler 的用法

使用fiddler进行抓包 举例一些常见的代理工具 1.wireshark:功能非常强大,但是使用起来更复杂一些 2.fiddler:功能虽然比wireshark少,但是使用简单方便,功能也足以应付大部分场景了 安装了fiddler之后,http和https的请求和响应都会被抓包工具捕捉到,其他的不会 打开软件,左侧是…

网络安全:六种常见的网络攻击手段

1、什么是VPN服务&#xff1f; 虚拟专用网络&#xff08;或VPN&#xff09;是您的设备与另一台计算机之间通过互联网的安全连接。VPN服务可用于在离开办公室时安全地访问工作计算机系统。但它们也常用于规避政府审查制度&#xff0c;或者在电影流媒体网站上阻止位置封锁&#…

mybatis:mybatis-generator插件使用

mybatis&#xff1a;mybatis-generator插件使用 1 idea配置 idea&#xff0c;点击File->Settings->Plugins->设置&#xff0c;点击&#xff1a;Manage Plugin Repositories: 配置如下&#xff1a; http://plugins.jetbrains.com/下载插件并重启idea&#xff1a; 2 …

Avalonia环境搭建

1.开发文档 开发文档&#xff0c; GitHub项目地址 https://github.com/avaloniaui/avalonia 2.VS2022 及扩展安装 建议使用vs2022最新版本下载并安装扩展Avalonia for Visual Studio 2022 3.安装Avalonia UI模板 dotnet new install Avalonia.Templates 查看安装版本 dot…

3 个令人惊艳的 AI 文档神器,开源了!

公众号关注 “GitHubDaily” 设为 “星标”&#xff0c;每天带你逛 GitHub&#xff01; 现今的互联网时代&#xff0c;无论哪个行业&#xff0c;在日常各种工作的沟通协作中&#xff0c;我们都免不了要与各种文档打交道。 但是&#xff0c;人的精力与任务处理速度毕竟有限&…

WinApp自动化测试之工具的选择

WinApp&#xff08;Windows APP&#xff09;是运行在Windows操作系统上的应用程序&#xff0c;通常会提供一个可视的界面&#xff0c;用于和用户交互。 例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome&#xff0c;都属于WinApp。常见的WinA…

8. Java本项目知识基础---下篇

Java本项目知识基础—下篇 1. String 拼接字符串 进行头部、中部、尾部拼接 &#xff08;简单、内存占用大&#xff09; StringBuffer或StringBuilder进行append拼接&#xff08;复杂、内存占用小&#xff09; public static void main(String[] args) {String str "abc…

Z410 2023款无人机,专为零基础开发者打造的入门级开源无人机

为什么开发Z410升级款-Easydrone无人机 新手开发者通常在本科阶段加入人工智能行业&#xff0c;对无人机二次开发往往一知半解&#xff0c;面临着C、Python、ROS和mavlink等一系列入门知识&#xff0c;学习起来非常困难&#xff0c;学习的过程中也面临许多挫折。为了帮助零基础…