哪里需要(不需要)完整的类型?

2024-01-06

我最近惊讶地发现这段代码可以编译(至少在 gcc 和 MSVC++ 上):

template<typename T>
class A {
public:
    T getT() { return T(); }
};

class B : public A<B> { };

当这没有发生时:

class A;

class B : public A { };

class A {
public:
    B getB() { return B(); }
};

对我来说,模板类可以采用不完整的类型作为模板参数,并具有一个通过调用其构造函数返回类型并仍然可以编译的函数,这似乎很奇怪。那么到底哪里需要完整的类型(或者如果列表更短,哪里不需要它们)?


以下是不需要 Complete 类型的场景:

  • 将成员声明为不完整类型的指针或引用。
  • 声明接受/返回不完整类型的函数。
  • 定义接受/返回不完整类型的指针/引用的函数。
  • 作为模板类型参数。

基本上,您可以在编译器不需要知道内存布局的任何地方使用不完整类型。type.

至于允许模板类型参数为不完整类型,标准在14.3.1 模板类型参数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

哪里需要(不需要)完整的类型? 的相关文章

随机推荐

  • 开发过程中Meteor自定义mongodb

    我将如何使用 实时运行的 MongoDB 来开发另一个流星应用程序 我尝试修改 meteor server server js 并指定MONGO URL运行前无济于事meteor 这没有使用捆绑的 MongoDB 它必须是一个单独的 自定义
  • docker容器内的Python,优雅地停止

    我正在运行一个非常基本的 Python 循环示例Windows docker 容器 我愿意优雅地停下来 该脚本在我的 dockerfile 中以这种方式启动 CMD python exe test py 在 docker 文档中说SIGTE
  • Mysql连接两个表

    我需要连接两个表 请帮助我
  • Plotly:如何向现有绘图添加箭袋?

    我想用plotly python 将箭袋添加 到现有图形中 但我能找到的唯一平静的文档要么只创建一个箭袋 here https plotly github io plotly py docs generated plotly figure
  • 在 C# 中将十六进制字符串转换为其数值[重复]

    这个问题在这里已经有答案了 我的表格上有一个文本框 我想将 0x31 作为字符串写入文本框 然后当我单击按钮时 我想将此字符串转换为 0x31 作为十六进制值 我如何将此字符串转换为十六进制值 int i Convert ToInt32 0
  • 指针算术:越界而不取消引用

    我想知道以下代码是否不被 C 标准接受 int n 10 double p new double 0 double q p n std cout lt lt n lt lt static cast
  • Motorola MC3190 手持计算机 Windows 6.0 ce 上的任务管理器

    我试图找出为什么网页会导致 Motorola MC3190 内存泄漏 条形码扫描仪是 Windows 6 0 CE 中的新增功能 没有安装任何程序 仅默认安装 我们只使用IE 当我们使用它两周后 扫描仪内存耗尽并且崩溃了 完全重新启动后 一
  • Android 模拟器对 Xamarin 的 AMD 进程没有响应问题

    当我将 Windows 更新到 Windows 11 时 我注意到当我为 Xamarin 项目运行 Android 模拟器时 它冻结并表示没有响应 我尝试了以下这些项目 但无法解决我的问题 减小仿真器设备的 RAM 大小 降低模拟器设备的分
  • 电子邮件字符串集合的 JPA 验证

    我的 bean 中有一个字符串列表 这些字符串是电子邮件 我想验证它们 Email ElementCollection fetch FetchType LAZY OrderColumn private List
  • 更快地实现对所有可能组合的过滤

    考虑我有一个像这样的数据框 set seed 1 q lt 100 df lt data frame Var1 round runif q 1 50 Var2 round runif q 1 50 Var3 round runif q 1
  • 画布上的drawImage在firefox中具有奇怪的宽高比和其他问题

    我运行的是 Firefox 3 5 6 我想在画布上显示图像并在其上绘制几条线 它需要在 Firefox 和 Internet Explorer 使用 excanvas 中正确显示 这是我得到的 上图是我在 IE8 中看到的 下图是我在 F
  • 字典理解中的 if-else [重复]

    这个问题在这里已经有答案了 是否可以使用else声明 如果是 如何 dictcomp 无法使用else作为理解本身的一部分 参见this https docs python org 3 reference expressions html
  • 如何在Linux中查询Vsync相位

    我需要创建一个 C 函数 它将返回下一个 Vsync 间隔之前的秒数作为浮点值 Why 我正在创建显示跟随鼠标光标的矩形的程序 表面上OpenGL在glXSwapBuffers函数中提供了垂直同步机制 但我发现这是不可靠的 使用某些卡驱动程
  • Masonry 不适用于动态内容

    Masonry 无法处理我的动态内容 我不知道为什么 我不认为这是我这边的错误 至少我已经查看了代码几个小时了 我找不到任何不起作用的东西 reads listbox php and cycles through the array cal
  • 在 GCP 上部署 Weaviate k8s 设置时,无法在 API 组中列出资源“configmaps”

    运行时 在 GCP 上 helm upgrade values values yaml install namespace weaviate weaviate weaviate tgz 它返回 UPGRADE FAILED Error co
  • 键入时向数字添加逗号

    我试图在用户输入数字时添加逗号 选择的正确语法是什么input form control带属性的类number输入Jquery 编辑 我无法更改 HTML 代码 因为它是使用 Bootstrap 从 Django 输出的 HTML span
  • 为什么宇宙飞船运算符里面只有一个等号?

    为何宇宙飞船操作员 lt gt 选择有一个等号而不是两个 这是否被视为与一个等号 通常表示赋值 和两个等号 通常表示比较 不一致 为什么会有两个 里面只有一个 lt gt and 这一点也不矛盾 仅有的 不一致 这是为了避免与赋值运算符发生
  • 如何编写惯用的构造函数

    我对 Go 中的构造函数感到困惑 我见过的大多数构造函数都会返回一个结构体 但 Effective Go 表明在某些情况下可以返回一个接口 根据 普遍性 规则 https golang org doc effective go html g
  • 标志“-D_POSIX_C_SOURCE=200112L”是什么意思?

    没有它 我无法使用连接到互联网所需的库 但我不知道这意味着什么 D POSIX C SOURCE 200112L 谁能解释一下吗 随着时间的推移 POSIX 经历了多次修订 每个新版本都更改了它支持的功能集 该宏定义了您希望使用哪组功能来构
  • 哪里需要(不需要)完整的类型?

    我最近惊讶地发现这段代码可以编译 至少在 gcc 和 MSVC 上 template