当前位置: 首页 > news >正文

C++关键字:typename 用于依赖名消歧器(disambiguator)

目录

1.  说明

2.  示例


1.  说明

在模板(包括别名模板)的声明或定义中非当前实例的成员且依赖于模板参数的名称不视为类型,除非使用关键字 typename 或除非它已被建立为类型名称(例如使用 typedef 声明或用于命名基类)。

2.  示例

#include <iostream>

#include <vector>

int p = 1;

template<typename T>

void foo(const std::vector<T>& v)

{

    // std::vector<T>::const_iterator 是一个依赖名,

    typename std::vector<T>::const_iterator it = v.begin();

// 如果没有“typename”, 以下被解析为类型相关数据成员“const_iterator”和某个变量“p”// 的乘法。因为在这一点有一个全局的可见 “p” ,此基板定义会编译

std::vector<T>::const_iterator* p; //认为 p 是上面的 int p

//typename std::vector<T>::const_iterator* p; //如此则认为 p 是//std::vector<T>::const_iterator指针类型

    typedef typename std::vector<T>::const_iterator iter_t;

    iter_t* p2; // “iter_t” 是一个依赖名, 但它被认为是一个类型名称(而不是变量)

}

template<typename T>

struct S

{

    typedef int value_t; // 当前实例成员

    void f()

    {

        S<T>::value_t n{}; // S<T> 是依赖的, 但无需“typename”

        std::cout << n << '\n';

    }

};

int main()

{

    std::vector<int> v;

    foo(v); // 模板实例化失败: 没有成员变量

    //按类型 std::vector<int>调用“const_iterator”

    S<int>().f();

}

关键字 typename 只能以这种方式在限定名称(例如 T::x)之前使用,但名称不需要依赖。通常使用限定名称查找来查找以 typename 为前缀的标识符。与使用详细类型说明符的情况不同,查找规则不会因限定符而改变:

struct A // A 嵌入变量 X 和一个嵌入类型 struct X

{

    struct X {};

    int X;

};

 struct B

{

    struct X {}; // B 有一个嵌入类型 struct X

};

 template<class T>

void f(T t)

{

    typename T::X x;

}

 void foo()

{

    A a;

    B b;

    f(b); // OK: 实例化 f<B>, T::X 指的是 B::X

    f(a); // error: 不能实例化 f<A>:

          // 因为修饰名查找 A::X 时找到数据成员

}

关键字 typename 甚至可以在模板之外使用。

#include <vector>

int main()

{

    typedef typename std::vector<int>::const_iterator iter_t;

    typename std::vector<int> v;

}

再比如标准库中 std::condiitonal 中的定义:

template <bool _Test, class _Ty1, class _Ty2>

struct conditional { // Choose _Ty1 if _Test is true, and _Ty2 otherwise

    using type = _Ty1;

};

template <bool _Test, class _Ty1, class _Ty2>

using conditional_t = typename conditional<_Test, _Ty1, _Ty2>::type; //如果去掉 typename ,

//则会提示语法错误: 标识符“type”           
 

http://www.dtcms.com/a/56254.html

相关文章:

  • C++进阶知识7 封装map和set
  • 分享能在线运行C语言的网站
  • Bitbucket SSH 访问设置指南
  • Vue3实战学习(Vue环境配置、快速上手及卸载、下载安装Node.js超详细教程(2025)、npm配置淘宝镜像)(1)
  • 常见Web应用源码泄露问题
  • 我的世界1.20.1forge模组开发(8)——自定义实体、AI
  • Hugging Face 推出 FastRTC:实时语音视频应用开发变得得心应手
  • H.264,H.265,H.266标准技术改进
  • 基于字符的卷积网络在文本分类中的应用与探索
  • TypeError: Invalid attempt to spread non-iterable instance
  • 金融合规测试:金融系统稳健运行的“定海神针“
  • Matlab——添加坐标轴虚线网格的方法
  • 本地化deepseek
  • Mybatis如何通过databaseId属性支持不同数据库的不同语法
  • 分布式数据库中的四种透明性:逻辑透明、位置透明、分片透明和复制透明
  • ⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II
  • Spring中的@Qualifier和@Resource注解有什么不同?
  • redis 支持哪几种数据结构
  • 【FPGA开发】Verilog-数据截断实现四舍五入效果、模块化改造、对比Matlab验证,Modelsim覆盖率
  • SSLScan实战指南:全面检测SSL/TLS安全配置
  • 股指期货交割日每月几号?为什么是第三个周五还是倒数第二个周五?
  • 第十五届蓝桥杯Scratch12月stema选拔赛真题—消失的水母
  • STM32之Unix时间戳
  • 计算机毕业设计Python+DeepSeek-R1大模型医疗问答系统 知识图谱健康膳食推荐系统 食谱推荐系统 医疗大数据(源码+LW文档+PPT+讲解)
  • Spring-framework源码编译
  • 完全背包-一维数组
  • Apache Commons Lang3 和 Commons Net 详解
  • 【JavaScript】DOM和BOM是什么?
  • VUE3开发-9、axios前后端跨域问题解决方案
  • 1998-2022年各地级市第三产业占GDP比重数据/地级市第三产业占比数据(全市)