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

Effective C++ 条款42:了解 typename 的双重意义

文章目录

    • 条款42:了解 `typename` 的双重意义
      • 示例 1:指涉嵌套从属类型
      • 示例 2:`typename` 与 `class` 互换
      • 示例 3:在基类列表和成员初始化列表中使用
      • 使用规则

条款42:了解 typename 的双重意义

关键字 typename 在 C++ 中有两种主要用途:

  1. 标识嵌套从属类型名称
    当指涉模板中的嵌套从属类型名称时,必须使用关键字 typename 来明确表示该名称是类型,而不是变量或其他实体。

  2. 声明模板参数
    在声明模板参数时,typenameclass 关键字可以互换使用。


示例 1:指涉嵌套从属类型

在模板中,当使用嵌套从属类型名称(即依赖于模板参数的类型名称)时,需要在名称前添加 typename

template <typename C>
void print2nd(const C& container) {
    if (container.size() >= 2) {
        typename C::const_iterator iter(container.begin());
        std::cout << *iter << std::endl;
    }
}

分析

  • C::const_iteratorC 的嵌套类型。
  • 编译器需要通过 typename 明确告知,C::const_iterator 是类型,而不是静态成员或其他实体。

示例 2:typenameclass 互换

在声明模板参数时,可以使用 typenameclass,两者等效:

template <class T>
class MyClass {
    // 使用 class 声明模板参数
};

template <typename T>
class AnotherClass {
    // 使用 typename 声明模板参数
};

示例 3:在基类列表和成员初始化列表中使用

在基类列表和成员初始化列表中,不允许将 typename 用作基类修饰符:

template <typename T>
class Derived : public Base<T>::Nested {  // 错误:不允许 "typename"
public:
    explicit Derived(int x) : Base<T>::Nested(x)  // 错误:不允许 "typename"
    {
        typename Base<T>::Nested temp;  // 正确:在函数体内需要 "typename"
    }
};

总结

  • 在基类列表和成员初始化列表中,嵌套从属类型会被默认为类型。
  • 在函数体内,需要明确使用 typename 标识嵌套从属类型名称。

使用规则

  1. 必须使用 typename 的场合

    • 指涉模板中的嵌套从属类型名称。
  2. 不得使用 typename 的场合

    • 在基类列表中。
    • 在成员初始化列表中。
  3. typenameclass 的选择

    • 二者在模板参数声明时可以互换,选择哪一个是风格问题。
    • 对于代码一致性,推荐统一使用一种风格,例如偏好 typename

通过正确理解和使用 typename,可以有效避免编译错误,确保代码的清晰和可维护性。


http://www.kler.cn/a/458907.html

相关文章:

  • 基于python大数据的美团外卖的数据分析系统的设计与实现
  • sqlite3 python如何查表结构
  • 浅谈下Spring MVC的执行流程
  • typescript中的interface理解
  • 基于TCP的Qt网络通信
  • Python 实现 冒泡排序算法示例
  • 玉米中的元基因调控网络突出了功能上相关的调控相互作用。\ca.19a5.R
  • vue项目利用webpack进行优化案例
  • 小米路由器开启SSH,配置阿里云ddns,开启外网访问SSH和WEB管理界面
  • SAP-MM-物资库存调度调剂清单
  • 深入探讨C++中的互斥锁管理:`std::lock_guard`与`std::unique_lock`
  • C++ 设计模式:模板方法(Template Method)
  • Zookeeper中version-2目录下存放数据
  • 生态碳汇涡度相关监测与通量数据分析实践技术应用
  • mysql一个表只能由一个自动递增列吗
  • CKA认证 | Day7 K8s存储
  • 封装一个自己的JS或TS库,并发布到npm上
  • 网络基础入门到深入(2):网络协议-TCP/IP协议栈
  • PowerShell 常见问题解答
  • 深度学习工作:从追求 SoTA 到揭示新现象
  • 数据库的概念和操作
  • Mysql高级
  • 天通卫星技术,保障无信号区域的高效通信与监测
  • C++笔记4:C和C++混合编程,C不能识别C++的类内函数编译报错怎么办
  • 【优选算法】Sliding-Chakra:滑动窗口的算法流(下)
  • 【uni-app】微信小程序使用lime-painter生成海报