在 C++ 中何时调用模板类静态成员的构造函数?

2023-11-25

有大量关于何时调用普通类的静态成员的构造函数的信息。但是,我发现模板类有一些奇怪的行为。

以下程序的输出应该是什么? (请注意,我使用 printf 来避免 std::cout 的任何静态初始化顺序失败并发症。)

#include <iostream>

class B {
public:
  B(const std::string &s) { printf("Hello I am B from %s\n", s.c_str()); }
};

template<typename T>
class Atempl {
public:
  static B b_;
};

class A {
public:
  static B b_;
};

template<typename T>
B Atempl<T>::b_("Atempl");
B A::b_("A");

class C : public Atempl<int> {
};

int main(int argc, const char *argv[]) {
  return 0;
}

我认为输出应该是:

Hello I am B from A
Hello I am B from Atempl

但是在 FreeBSD 7.3 上使用 g++ 4.3 我得到:

Hello I am B from A

如果我添加行

template class Atempl<int>;

一切都很好,我得到了预期的输出。问题是,为什么C类的声明不算作模板的实例化 阿坦普尔 并导致 B 的构造函数被调用?这是标准的一部分还是 g++ 4.3 中的错误?


在类模板中,执行隐式实例化时,会根据需要实例化成员。由于代码不使用静态成员,因此它甚至没有在整个应用程序中实例化。

当您进行显式实例化时,整个类及其所有成员都会被实例化,其中包括静态成员变量,然后该变量将被初始化,您将获得预期的结果。

如果没有显式实例化,你可以做类似的事情B* p = &Atempl<int>::b_;(或静态成员的任何其他使用)来触发实例化。

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

在 C++ 中何时调用模板类静态成员的构造函数? 的相关文章

随机推荐

  • 将自定义属性添加到 Firebase Auth

    我浏览了 Firebase 的文档 似乎找不到向 FIRAuth 添加自定义属性的方法 我正在从 Parse Server 迁移一个应用程序 我知道我可以设置用户的用户名 电子邮件和 objectId 不 我看到我可以选择电子邮件 disp
  • 让 XCUIElement 为 Automate UITest 执行 3D 触摸?

    我正在创建自动化 UI 测试测试用例 我想测试用户与元素进行 3D Touch 交互时的场景 然后向他们显示 Peek 和 Pop 视图 我似乎找不到任何可能的方法来在元素上模拟 3D Touch 并继续 有人对此有任何想法吗 或者 3D
  • 类型错误:尝试将整数保存到文本文件时需要字符缓冲区对象

    我正在尝试做一个very简单的 计数器 应该跟踪我的程序被执行的次数 首先 我有一个仅包含一个字符的文本文件 0 然后我打开该文件 将其解析为int add 1到该值 然后尝试将其返回到文本文件 f open testfile txt r
  • Lua 的 Lint-ing 工具 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我最近开始为 Minecraft 的 mod Computer Craft 编写一些 Lua 我一直沉迷于 javascript 我发现最有用的工具
  • 是否有 Eclipse C# 高亮、代码完成插件

    我需要一个 Eclipse 3 插件来突出显示 C 语法并希望完成代码 我正在运行 Mac 和 Windows 版本的 Eclipse 我已经评估了 改进 C 但它似乎不起作用 看一下Emonic 它是一个 Eclipse 插件 允许您使用
  • java.lang.VerifyError: org/primefaces/behavior/confirm/ConfirmBehaviorHandler 函数返回类型错误

    今天早上 南非时间 Maven 下载了最新的 primefaces jar 版本 5 3 虽然我的项目设置方式是 Maven 将项目部署到我的 Web 容器 在本例中为 Wildfly 9 0 1 Final 但由于以下异常 部署失败 20
  • 如何在不使用分析功能的情况下获得第二高薪水部门?

    假设我们每个部门有 3 名员工 我们总共有 3 个部门 下面是示例源表 Emp deptno salary A 10 1000 B 10 2000 C 10 3000 D 20 7000 E 20 9000 F 20 8000 G 30 1
  • 如何让PdfPTable动态计算列宽

    我想创建一个 PdfPTable 其中包含包含不同长度字符串的列 我了解到 每列的每个单元格 列的宽度都是相同的 默认 或者可以设置每列应占用的空间比例 但是 我希望列的宽度符合要求 但不能更宽 具体取决于插入的数据 假设表格很容易适合页面
  • 如何配置在 AWS/ElasticBeanstalk/Docker 上运行的 GlassFish 实例?

    我正在使用 GlassFish 提供 Java EE Web 应用程序 在我的本地开发机器上一切正常 我有 将 postgres JDBC 库复制到正确的位置 在 Glassfish 管理控制台中配置连接池和 JDBC 资源 部署了一个使用
  • 如何以编程方式关闭 Android 手机?

    我想做一个锁屏应用程序 当手机处于锁定模式时 插入 USB 时会关闭手机 以防止其他用户访问手机数据 有谁知道如何以编程方式关闭 Android 设备 以便其他人在设备处于锁定模式时无法访问数据 这是锁定屏幕活动上的主页按钮的代码 Over
  • 实体框架核心两个对象作为主键

    我有一个用于管理朋友关系的模型 它看起来如下 public class Relationship Required public User User get set Required public User Friend get set R
  • TransactionInactiveError:无法在“IDBObjectStore”上执行“添加”:事务未激活

    在这段代码中我面临的问题是store1 add当我查看控制台时它说TransactionInactiveError Failed to execute add on IDBObjectStore The transaction is not
  • SAS:重新排列数据步骤中的字段顺序

    在 SAS 9 中 如何在简单的数据步骤中重新排列字段的顺序 Data set2 Something probably goes here set set1 run 因此 如果 set1 有以下字段 Name Title Salary A
  • 在“for”循环中访问索引

    如何在使用 a 迭代序列时访问索引for loop xs 8 23 45 for x in xs print item format index x 期望的输出 item 1 8 item 2 23 item 3 45 使用内置函数enum
  • 带有 C 指针的 Pickle Cython 类

    我正在尝试写一个 reduce 包含 C 指针的 cython 类的方法 但迄今为止发现的有关执行此操作的最佳方法的信息很少 有大量关于如何正确编写 reduce 使用 numpy 数组作为成员数据时的方法 我想远离 Numpy 数组 因为
  • 如何改进 Gnuplot 中渐变和填充元素的渲染?

    我注意到 Gnuplot 在处理填充元素时会产生丑陋的伪影 下图的调色板中有一个实例 另一个例子是当使用filledcurves从 ASCII 文件中的点定义的两条曲线之间 在这种情况下 您可以看到 该区域并不是线条之间真正的实心填充 而是
  • Ant Design 日历:如何更改星期格式

    我正在使用Ant Design 日历组件在我的项目中 我将其设置如下 目前星期几的格式是dd Eg Su Mo Tu etc 是否可以通过 props 更改格式ddd Eg Sun Mon Tue etc 不支持直接在ant design组
  • C# 模拟鼠标在非活动窗口的某个位置单击

    这是原来的问题 但被认为是java的 在Java中模拟鼠标在非活动窗口的某个位置单击 不管怎样 我正在构建一个在后台运行的机器人 这个机器人需要我点击 当然 我希望能够在机器人运行时做其他事情 所以我想知道是否可以在非活动窗口的某个位置模拟
  • 多点运算符(C++ 类)

    我必须实施一个课程Vector 它设置多维向量的坐标 并且在使用此特定代码调用时将起作用 我无法更改这部分 const int NumOfDimensions 5 Vector x NumOfDimensions x Set 0 1 1 S
  • 在 C++ 中何时调用模板类静态成员的构造函数?

    有大量关于何时调用普通类的静态成员的构造函数的信息 但是 我发现模板类有一些奇怪的行为 以下程序的输出应该是什么 请注意 我使用 printf 来避免 std cout 的任何静态初始化顺序失败并发症 include