当前位置: 首页 > 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”           
 

相关文章:

  • 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安全配置
  • 专门做面条菜谱的网站/怎么样做seo
  • 领卷网站怎么做的/搜索引擎优化
  • 做查询网站费用/百度指数平台
  • 网站建设高端设计/重庆百度关键词优化软件
  • 西樵网站建设公司/电脑培训机构
  • 赌博游戏网站怎么自己做/网络广告网站