问题标签 [explicit-specialization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
320 浏览

c++ - 显式成员特化

g++ 3.4.5 接受此代码:

但我不确定它实际上是合法的 C++03。尤其,

[14.7p3] 在类模板、类模板的成员或类成员模板的显式特化声明中,显式特化的类的名称应为模板 ID。

这个要求是说在这个例子的最后必须使用非 typedef 版本吗?还是我误解了什么?

编辑:进一步的证据:缺陷报告 403表明将类型(在该上下文中,函数调用表达式的参数类型)说成是模板 ID是不正确的,因为模板 ID具有句法含义,而不是语义一。后来的标准草案在 3.4.2中使用了“类模板专业化”而不是“模板 ID ”。

这支持了这样的论点,即尽管A<B>C表示相同的类型(并且具有相同或几乎相同的语义含义),但A<B>它是一个模板 IDC不是,因为术语模板 ID将句法内容指代为一系列标记而不是这些标记的含义。

0 投票
2 回答
406 浏览

c++ - 显式专业化,C++

如何为对象编写显式特化

在虚拟方法 clear() 中?

级车:

编译错误:

错误 16 错误 C3855: 'List': 模板参数 'Car' 与声明 h:...\List.hpp 不兼容 75 错误 20 错误 C2264: 'List::clear' : 函数定义或声明错误;未调用函数 h:...\List.hpp 75

但是这个结构还可以

0 投票
3 回答
3440 浏览

c++ - 为什么这个 C++ 显式模板特化代码是非法的?

(注意:我知道它是非法的,我正在寻找语言使其如此的原因。)

错误:

与谷歌的快速通过发现了这个规范的引用,但它只提供了什么而不是为什么。

编辑:

一些回应转发了这样的论点(例如证实了我的推测),即规则是这样的,因为否则会违反单一定义规则(ODR)。然而,这是一个非常弱的论点,因为在这种情况下,它不成立,原因有两个:

  1. 将显式专业化移动到另一个翻译单元可以解决问题,并且似乎不会违反 ODR(或者链接器说)。
  2. ODR 的简短形式(应用于函数)是任何给定函数都不能有多个主体,而我没有。唯一定义函数体的地方是显式特化,因此调用Foo<int>不能定义模板的泛型特化,因为没有要特化的泛型体。

对此事的猜测:

关于为什么存在该规则的猜测:如果第一行提供了定义(而不是声明),那么实例化之后的显式特化将是一个问题,因为您将获得多个定义。但在这种情况下,唯一的定义是显式专业化。

奇怪的是以下(或我正在处理的真实代码中的类似内容)有效:

档案一:

文件 B:

但是使用它通常会开始创建意大利面条导入结构。

0 投票
5 回答
1352 浏览

c++ - 重载模板函数时显式特化和常规函数之间的区别

我今天很开心。这里是 n00b 问题编号 7:

当您尝试重载模板函数时,显式特化和普通函数有什么区别?

使用显式专业化的合适情况是什么?我不太明白:

反对:

0 投票
2 回答
5021 浏览

c++ - 类模板显式特化还可以声明其他内容吗?

如果此代码无效,那就太好了。但它在概念上是合理的,GCC接受它,尽管 Comeau 没有:

编辑:上面的编译但r似乎没有被声明到任何范围内,所以它基本上被忽略了。)

显式特化填充了模板和类之间的一种下层区域。由显式特化声明的类型一旦定义就完成了。从编译器的角度来看,它不是模板。如果它是一个参数化的模板,那么声明一个对象是不可能的。考虑§14/3:

在模板声明、显式特化或显式实例化中,声明中的 init-declarator-list 最多应包含一个声明符。当这样的声明用于声明类模板时,不允许使用任何声明符。

“用于声明类模板”是什么意思?显然,主模板声明了一个类模板。根据 §14.5.5/1(FDIS 编号),部分专业化也是如此:

类模板名称为 simple-template-id 的模板声明是 simple-template-id 中命名的类模板的部分特化。

但是,当涉及到显式特化时,标准是根据标记序列前面的声明来说话的template<>。它看起来像一个模板,它命名了一个模板名称,但它似乎没有声明一个模板。

真正奇怪的是,§14/3 将声明符的数量限制为“最多一个”。函数模板声明、显式特化或实例化必须只有一个声明符。任何涉及类模板的声明都必须完全为零……除了显式特化,它似乎已经落入了裂缝。忠实地,海湾合作委员会拒绝允许

我倾向于同意 GCC 的解释,尽管它可能是胡说八道。不幸的是,它可能会抑制它检测丢失分号的能力。请让允许的声明符的数量完全为零!

0 投票
6 回答
275 浏览

c++ - 库内外专用的模板类

考虑这个综合示例。我的 Visual Studio 2010 解决方案中有两个本机 C++ 项目。一个是控制台exe,另一个是lib。

lib中有两个文件:

还有一个exe文件:

我知道,我实际上不应该这样做,但这只是为了了解正在发生的事情。那就是,会发生什么:

那么这到底是怎么发生的,链接器用TImage<char>exe 的版本覆盖了 lib 的版本TImage<char>?但是由于没有 exe 的版本TImage<int>,它保留了 lib 的版本TImage<int>?.. 这种行为是否标准化,如果是,我在哪里可以找到描述?

更新:下面给出的效果解释是正确的,谢谢。但问题是“这到底是怎么发生的”?..我希望得到一些链接器错误,比如“多重定义的符号”。所以最合适的答案来自Antonio Pérez 的回复

0 投票
1 回答
3932 浏览

c++ - 我可以和不可以专注于 std 命名空间吗?

允许用户向std命名空间添加显式特化。但是,有一些模板是明确禁止我专门研究的。

哪些模板可以专业化,哪些不能专业化?

0 投票
2 回答
448 浏览

c++ - std::unordered_set作为 Foo 类的成员

我正在编写一个具有自己类型的 unordered_set 作为成员的类。因此,我需要为hash<Foo>. 这个特化需要在声明 Foo 之后定义。但在我看来,好像hash<Foo>在定义成员之前我已经需要专业化了unordered_set<Foo>。至少它没有编译并在那里失败。我尝试了哈希模板的前向声明,但也无法使其正常工作。

相关的代码片段是:

提前致谢

0 投票
1 回答
86 浏览

c++ - 如何使用类模板完全专门化功能模板?

在上面的代码中,我如何使用类模板明确地专门化函数 foo?

0 投票
2 回答
3992 浏览

c++ - 函数模板中的数组类型推导

我有一个模板方法如下: -

然后我有使用上述方法的代码: -

我的问题是为什么我必须明确指定模板参数。不能自动推断,以便我可以使用如下: -

我确定我缺少一些基本的东西!备用锤子!