c++ - 什么是`class template Example;` 语句对 C++11 意味着什么?
问题描述
我在cplusplus.com被称为“显式模板实例化”,它给出了以下示例:
template <typename T> class Example
{
public:
Example( T test )
{
_data = test;
}
void setTest(T test)
{
_data = T;
}
private:
T _data;
};
class template Example<int>;
class template Example<float>;
class template Example<double>;
除了对我来说似乎是一个遗漏错误,其中一个类型被尝试分配给一个成员变量——_data = T
而不是我认为应该的_data = test
——我不明白最后 3 行声明或指示什么编译器要做的,究竟是什么?
我知道模板是什么,用它们构建了程序,并且大致了解它们的实例化和专业化。我对后两者的理解可能确实存在一些漏洞,但我通常使用例如template class Example<int>;
表单而不是片段中显示的那个来指示显式模板实例化。
我尝试使用编译代码段g++ -std=c++11 -pedantic
,它编译得很好并且没有警告(我_date = T
首先更正了上面的错误)。
这是在我对一个相关问题的答案发表评论之后发生的,我仍然不确定片段中的最后 3 行中的任何一个是模板特化还是实例化。
我还尝试在ISO 发布的 C++11 草案template
中找到相关的语法产生规则(允许after class
),但空手而归。
解决方案
我们可以从下面的 godbolt示例中看到,根据 clang 和 MSVC,这是格式错误的,并且查看Explicit instantiation section [temp.explicit]的标准草案部分,我认为 gcc 没有任何理由接受它。
我相信鉴于该主题,文章“可能”的含义是:
template class Example<int>;
template class Example<float>;
template class Example<double>;
看起来在 C++11 之前这种语法是允许的,请参阅缺陷报告 1707:没有嵌套名称说明符的详细类型说明符中的模板(强调我的):
10.1.7.3 [dcl.type.elab] 中详细类型说明符的语法部分内容如下:
elaborated-type-specifier: class-key nested-name-specifieropt templateopt simple-template-id
这允许在没有嵌套名称说明符的情况下使用模板关键字,例如 struct template S。这与模板关键字的其他用途不一致。最好将产生式分成两部分,并且只允许关键字跟随在嵌套名称说明符之后,
……
因此,对于导致警告的此评论,这更有意义。-ansi
另一位回答者提交了两个错误报告。
cppreference对 Explicit instantiation和这个 SO question Explicit instantiation - when it is used 有很好的讨论。解释更多细节为什么这很有用。
另请注意,我们可以看到这篇Meta 帖子:Links being changed to cppreference.com,该网站已知有不正确的信息,并且通常社区更喜欢cppreference作为可靠的 C++ 参考。
推荐阅读
- vue.js - vue中使用dropzone.js,调用带有图片文件名的函数
- javascript - 如何根据视口的当前宽度使用表情符号或符号填充跨度?
- html - 在不同尺寸的浏览器上显示时,如何防止我的框元素变形或变形
- vue.js - 从 Vuex 的另一个动作中调用一个动作是不好的做法吗?
- google-sheets - 如何水平引用单独工作表上的垂直单元格(但每个第 n 个单元格水平)
- python - 使用 smtplib 通过 python 自动发送电子邮件,使用从 gmail 发送到 iusd(学区)的发送,不通过
- c# - 使用结构映射在运行时将对象传递给类构造函数
- javascript - 如何在 Blazor 中模拟 setTimeout()?
- c# - 如何通过单击按钮在 Windows 窗体应用程序中停止执行操作?
- scala - 面临 sbt 依赖的问题