当前位置: 首页 > 知识库问答 >
问题:

关于模板等价/重新定义的C++规则?

锺离辰沛
2023-03-14
template <int x, int y> struct S {}; // [1]
template <int w, int z> struct S {}; // [2] <-- ill-formed
template <int x> struct S<x,5+2> {}; // [3]
template <int w> struct S<w,3+4> {}; // [4] <-- ill-formed
template <> struct S<6+1,4+3> {}; // [5] 
template <> struct S<2+5,8-1> {}; // [6] <-- ill-formed

C++标准中的哪种特定语言是造成这种格式不佳的原因?

当两个模板定义定义一个模板的相同专门化时(当它们是一个模板的两个不同专门化时),它在哪里说明?

它在哪里说这是不允许的(重新定义相同的专门化)?

共有1个答案

卓云
2023-03-14

我要在这里说“一个定义规则”适用于这里(强调他们和我的):

任何翻译单元不得包含任何变量、函数、类类型、枚举类型或模板的一个以上定义。

请注意,模板也属于这一规则,而不仅仅是变量。

至于编译器为什么允许这样做,您不是重新定义模板,而是专门化它。这与大多数专业并没有太大的不同。这里奇怪的区别是你的专业是模板化的。

这可以通过在1之前先执行3来看出:

template <int x> struct S {}; // [3] <-- S takes one parameter now
template <int x, int y> struct S {}; // [1] <-- this is a redefinition, because S only takes one parameter.
template <typename... T>
struct Foo;

template <typename T1>
struct Foo<T1> {};

template <typename T1, typename T2>
struct Foo<T1,T2> {};
 类似资料:
  • 在我看来,类的定义在Protégé5.2.0中不能正常工作。但愿这是我这边的误会。 事先谢谢你,

  • 我想知道在java中是否有与此等效的: 当然,假设。。。有一个名为Person的类,其FirstName字段和LastName字段为{get;set;}

  • 我是一名普通的C#开发人员,但偶尔会用Java开发应用程序。我想知道是否有与C#async/await相当的Java?简单地说,java等价物是什么:

  • 问题内容: Java的运算符等效于什么(在C#中)? (为澄清起见,我不是指and 运算符。) 问题答案: 在C#中,可以使用无符号整数类型,然后使用和执行您期望的操作。有关移位运算符的MSDN文档为您提供了详细信息。 由于Java不支持无符号整数(除之外),因此需要此附加运算符。

  • 在 cmf中模板就是一个 html 文件,可分为前台模板文件和后台模板文件; 前台模板位于 themes 目录下,后台模板位于 admin/themes 目录下,前后台都是多主题机制的,可以分开设置不同的主题; 前台默认模板是 simplebootx,以后也可能会换,我们先以这个为例; 这是前台模板的结构;应用之间彼此分开,Portal目录下就对应的是application/Portal应用的模板

  • 问题内容: 在C#中,您可以匿名定义委托(即使它们不过是语法糖)。例如,我可以这样做: 是否可以在Java中传递这样的代码?我正在使用处理框架,该框架具有Java的较旧版本(它没有泛型)。 问题答案: Java 8之前的版本: 最接近委托的Java是单方法接口。您可以使用匿名内部类。 Java 8及更高版本: Java 8 在该语言中添加了lambda表达式。