专用模板类的静态成员初始化

2024-02-20

class A
{
};

template <typename A, int S>
class B
{
public:
        static int a[S];

        B()
        {
                a[0] = 0;
        }
};

template<> int B<A, 1>::a[1];

int main()
{
        B<A, 1> t;
        t;
}

它在 GCC 4.1 下编译,但不链接:

static.cpp:(.text._ZN1BI1ALi1EEC1Ev[B<A, 1>::B()]+0x5): undefined reference to `B<A, 1>::a'

如果可能的话,我希望保持初始化的专门化,因为数组保存了一些特定于该类型的数据。


对于静态成员特化,如果不初始化成员,则将其视为特化宣言,这只是说“哦,不要从主模板实例化成员,因为其他地方有专门的定义”。应该提到的是,定义应该出现在 .cpp 文件中(否则,您将获得相反的效果:多个定义),并且不带初始化程序的声明仍应放置在头文件中。

现在正确的语法确实如下,并且应该not出现在头文件中,但是在.cpp file

template<> int B<A, 1>::a[1] = { };

以下内容仍应出现在头文件中:

template<> int B<A, 1>::a[1];

这将作为专业宣言.


由此可见,您不能专门化仅具有默认构造函数且不可复制的成员,因为您需要以下语法:

// needs a copy constructor!
template<> Type Class<Arguments>::member = Type();

C++0x 修复了这个问题:

// doesn't anymore need a copy constructor
template<> Type Class<Arguments>::member{};

对于我们当中的标准人来说,以下是引述:

14.7.3/6:

如果模板、成员模板或类模板的成员被显式特化,则应在第一次使用该特化之前声明该特化,这将导致发生隐式实例化,在发生这种使用的每个翻译单元中;无需诊断。

14.7.3/15:

如果声明包含初始值设定项,则模板的静态数据成员的显式特化是定义;否则,它是一个声明。 [注意:没有用于定义需要默认初始化的模板静态数据成员的语法。

template<> X Q<int>::x;

无论 X 是否可以默认初始化(8.5),这都是一个声明。 ]

3.2/3:

每个程序都应包含该程序中使用的每个非内联函数或对象的确切定义;无需诊断。

3.2/5:

类类型(第 9 条)、枚举类型(7.2)、具有外部链接的内联函数(7.1.2)、类模板(第 14 条)、非静态函数模板(14.5.5)可以有多个定义、类模板的静态数据成员 (14.5.1.3)、类模板的成员函数 (14.5.1.1) 或程序中未指定某些模板参数的模板特化 (14.7、14.5.4) [.. .]

对此的限制是“未指定某些模板参数”意味着我们are允许执行以下操作,将其放入标头中(因此可能具有此专业化的多个定义):

template<> template<typename T>
Type OuterClass<int>::InnerClass<T>::StaticMember = 0;

在您的情况下,您指定了所有参数,使其不被允许多个定义的一个定义规则所覆盖。

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

专用模板类的静态成员初始化 的相关文章

  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 在c#中执行Redis控制台命令

    我需要从 Redis 控制台获取 客户端列表 输出以在我的 C 应用程序中使用 有没有办法使用 ConnectionMultiplexer 执行该命令 或者是否有内置方法可以查找该信息 CLIENT LIST是 服务器 命令 而不是 数据库
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 查找进程的完整路径

    我已经编写了 C 控制台应用程序 当我启动应用程序时 不使用cmd 我可以看到它列在任务管理器的进程列表中 现在我需要编写另一个应用程序 在其中我需要查找以前的应用程序是否正在运行 我知道应用程序名称和路径 所以我已将管理对象搜索器查询写入
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 为什么从字典中获取时会得到 Action<> 的克隆?

    我有以下字典 private Dictionary
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • C++ int 前面加 0 会改变整个值

    我有一个非常奇怪的问题 如果我像这样声明一个 int int time 0110 然后将其显示到控制台返回的值为72 但是当我删除前面的 0 时int time 110 然后控制台显示110正如预期的那样 我想知道两件事 首先 为什么它在
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 使用 C 在 OS X 中获取其他进程的 argv

    我想获得其他进程的argv 例如ps 我使用的是在 Intel 或 PowerPC 上运行的 Mac OS X 10 4 11 首先 我阅读了 ps 和 man kvm 的代码 然后编写了一些 C 代码 include
  • GCC 的“-Wl,option”和“-Xlinker option”语法之间有区别吗?

    我一直在查看一些配置文件 并且看到它们都被使用 尽管在不同的体系结构上 如果您在 Linux 机器上使用 GCC 将选项传递给链接器的两种语法之间有区别吗 据我所知 阅读 GCC 手册时 他们的解释几乎相同 From man gcc Xli
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string

随机推荐

  • 使用 R 删除列表中空的零长度行

    我有数据框列表 有些是空的 如何删除它们 S566X7221 1 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24
  • 如何从 Google Colab 访问我的 Google 云端硬盘文件?

    我使用以下网址从网址下载了图像urlretrieve urllib 在 Google Colab 中 但是 下载图像后 我无法找到图像 from google colab import drive drive mount content g
  • Vaadin:如何显示 MySQL 数据库中的数据?

    我正在开发 Vaadin Flow 版本 14 1 应用程序 但遇到了这个问题 我无法将其直接与 MySQL 数据库连接 我已经与 Maven 设置了 JDBC 连接 还创建了一个名为 Datasource 的单例类 在其中存储我的值和方法
  • 如何使用VBA在Excel中的所有行前面添加单引号

    我有一个电子表格 其中包含带有日期的第一列 我希望文本保留为 May 21 但采用字符串形式 单元格值应该是 May 21 但是当我尝试将其转换为字符串时 它使用 5 位数字 如果我将列保留为日期格式 它会首先自动选择 May 因此即使格式
  • 用于特定文本模式的 PHP 正则表达式

    在我的网站上 我在正文中插入了项目创建的年份 并将其替换为 六年前 或者无论有多长 所以在我的内容中我有 我们自 1998 年开始营业 并在 2011 年前制作了这种包装设计 我试图使用正则表达式将 2011 放入变量中以便稍后搜索和替换
  • 复制矩阵的一行或一列并将其插入到下一行/列中

    我想知道 MATLAB 中是否有一种简单的方法来执行以下操作 我想复制矩阵的行或列并将其插入到下一行 列中 例如 给定一个 3x3 矩阵 1 2 3 4 5 6 7 8 9 我想复制第一行并将其作为第二行插入 1 2 3 1 2 3 4 5
  • 提取模式两端由标识符括起来的多行

    我正在尝试从日志文件中提取特定事件的跟踪 为了查找相关事件 我查找 PATTERN 为了提取事件的完整跟踪 我希望提取由 SEPARATOR 包围的模式两端的行 例如 如果日志文件的内容是 Line1 Line2 SEP Line3 Lin
  • C# 显示隐藏窗口

    我正在开发一个 Excel 插件 在某些时候 我可以接收异步事件 如果 Excel 窗口在这些事件上隐藏 我需要能够显示该窗口 我能够存储Hwnd属性 我相信它必须是一个不可变的 int 引用来标识我的 Excel 窗口 有人可以详细说明这
  • 在 Php 中连接两个表[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有两张桌子 表1 类别 Id na
  • XML 架构中的数字 ID 类型

    我需要使用 XML 模式定义具有给定模式的 ID 类型 到目前为止我所拥有的是这样的
  • 将 LaTeX 表格直接打印到图像(PNG 或其他)

    有没有办法从 R 中将 LaTeX 表格直接打印到图像文件 以包含在另一个文档 网页中 基本上 我想向一个函数提供 LaTeX 代码 该函数将其作为图像保存到工作目录中 白日梦 有各种 LaTeX 到图像转换器脚本 旨在执行诸如将方程转换为
  • 将 tcp_max_tw_buckets 设置为非常小的值有什么副作用?

    我知道将 tcp max tw buckets 设置为相对较小的数字 例如 30000 或 50000 是很正常的 以避免主机有大量时间等待状态连接并且应用程序无法打开新连接的情况 这是被提及很多次的事情 比如这样的问题 如何减少TIME
  • NodeJS - 来自 app.js 的第三方 Api 调用

    我需要从 NodeJS 后端调用第 3 方 api 并将数据返回到前端的 ajax 调用 下面是我的代码 router post get data function request response var city name reques
  • 如何根据屏幕尺寸将Epub Html拆分为页面

    我正在开发一个读取电子书 epub 格式 的 Android 应用程序 目前我正在使用 Paul Siegeman 的 epublib 库 它确实是一个非常好的 epub 阅读器 但它有一些限制 例如我需要的 你无法水平移动页面 就像阅读一
  • Android 将多张位图合并为一张大图出错,无法回收位图

    我想将 ArrayList 中包含的许多小位图合并为一张大位图 但是 我不知道为什么大位图会循环 这意味着它似乎只复制数组中的第一个元素 我尝试绘制数组中的每个小位图进行测试 它工作正常 但是当我像下面的代码一样运行循环时 它会出错 另外
  • 如何使用LLVM在Windows for ARM上编译C++程序?

    Aim仅使用 LLVM 在 Windows for ARM 上编译 C 程序 WhyLLVM 因为宽松的许可 我开始怀疑我对LLVM的理解是否正确 在主机上做 使用 clang 前端 生成中间表示 该表示与目标无关 使用llc 后端 生成目
  • WebSocket 由于页面重新加载时出现暂停错误而关闭

    我有一个调用函数来重新加载页面的按钮 function doReload window location 大约五分之一的 Safari 11 会在控制台中抛出此错误 WebSocket connection to ws localhost
  • 是否可以使用 tkinter 将中文文本输入到 tk Text 和 Entry 小部件中?

    我正在使用 tkinter 开发一些 GUI 应用程序来操作用户输入的中文文本 我在应用程序中显示中文文本没有问题 在将文本粘贴到应用程序中时操作该文本也没有任何问题 但是当我尝试使用中文输入法将中文文本输入到文本或输入小部件等时 它显示为
  • 使用 send_file 从 Flask 向 React 前端发送文件会返回一串奇怪的字符

    在我当前的程序中 用户在react中选择一个文件 该文件被发送到flask return axios post http localhost 5000 time data headers Content Type multipart for
  • 专用模板类的静态成员初始化

    class A template