【问题标题】:If "struct" and "class" are same thing then why only "class" is used in template<class T> not the "struct"?如果“struct”和“class”是同一个东西,那么为什么在 template<class T> 中只使用“class”而不是“struct”?
【发布时间】:2021-07-02 11:42:37
【问题描述】:
template<class T>
struct E{};     //// no error


template<struct T>
struct F{};    ////error

错误:非类型模板参数不能具有类型“struct T” 模板

如果除了默认的privatepublic 访问说明符之外classstruct 是相同的东西,那么为什么这不起作用?

【问题讨论】:

  • 模板参数可以使用classtypename。不是classstruct。 C++ 通常具有在不同上下文中以不同方式使用的关键字。用例就是这样一种不同的上下文。
  • 你把这句话断章取义了。正确的上下文是当它们用于类定义时。
  • “因为标准是这样说的”(tm)
  • 我通常对差异的陈述是“您可能看到的唯一差异是 class 默认为 private 访问权限,struct 默认为 public 访问权限。”我已经看到了一些语言律师就 C++11 中的几个边缘案例进行的争论,我认为只有编译器编写者和那些解决非常有趣的问题的人才会关心这些案例。在随后的修订中,措辞可能已被清理干净。我不是在编写编译器或解决非常有趣的问题,所以我从来没有比较过他们争论的措辞。
  • 有人告诉 LightningRacesInOrbit 吗?他始终坚持 C++ 中只有类。

标签: c++ class templates struct


【解决方案1】:

原因是structclass不同的关键字。也就是说,它们不仅仅是在词汇层面上的别名,而是可以在不同的地方被语言以不同的方式使用。因此,它们在一种情况下的行为相似这一事实并不意味着您可以在另一种情况下互换使用它们。

正如您所说,它们在定义类时是相似的,但仅此而已。定义类型模板参数与定义类完全不同,它有自己的语法。该语法与定义类的语法无关,从语法的角度来看,关键字class 被用于两者的事实可以被认为仅仅是巧合(一个有用的巧合,但仍然如此)。并且该语法规定在定义类型模板参数时必须使用class(或typename)。

【讨论】:

  • 今天我了解到:structclass 定义类的另一个区别是 Microsoft ABI 对它们的处理方式不同。
  • @Eljay 有趣:可能用于 C/C++ 互操作,即它们是默认的“extern C”?会使双方更容易使用相同的标题。
  • 确切知道原因是什么会很有趣。在我看来,ABI 取决于在完成完全相同的事情时是使用一个关键字还是另一个关键字,这对我来说似乎很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
  • 2011-02-27
  • 1970-01-01
相关资源
最近更新 更多