gpt4 book ai didi

c++ - 继承嵌套模板类的特化

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:56 26 4
gpt4 key购买 nike

以下源码来自: Understanding partial specialization of inherited nested class templates

#include <type_traits>
struct Base
{
template<class U, class _ = void> struct Inner: std::true_type {};
template<class _> struct Inner<char, _>: std::false_type {};
};
struct Derived : Base
{
};

template<class _> struct Derived::Inner<int, _>: std::false_type {};

我有一个关于专门化继承类的问题,所以我用谷歌搜索,找到了上面的问题。上述问题中的源代码在 gcc/clang 中编译时没有任何问题,但 msvc 拒绝编译它,发出 C2427(参见 https://msdn.microsoft.com/en-us/library/10het5hx.aspx)。

上述情况(专门化非模板类的嵌套模板类)与https://msdn.microsoft.com/en-us/library/10het5hx.aspx中描述的情况大不相同。 (定义一个模板类的嵌套非模板类),我想。

msvc 与 gcc/clang 哪个是错误的?或者只是标准不清楚,无法指定此行为?

我希望 msvc 是错误的...

最佳答案

Clang 和 GCC 是错误的,而 MSVC 和 EDG 拒绝该部分特化定义是正确的。

偏特化本身就是一个模板,类模板定义在语法上是根据类定义构造的(在语法术语中,类说明符)。在这样的定义中,Derived::Inner<int, _>是一个类头名Derived::作为一个嵌套名称说明符

[9p11] 在标准中说:

If a class-head-name contains a nested-name-specifier, the class-specifier shall refer to a class that was previously declared directly in the class or namespace to which the nested-name-specifier refers, or in an element of the inline namespace set (7.3.1) of that namespace (i.e., not merely inherited or introduced by a using-declaration), and the class-specifier shall appear in a namespace enclosing the previous declaration. [...]

所以,你必须使用 Base::Inner<int, _> .


如评论中所述,上面的引用也适用于类模板显式特化定义(它们的语法生成最终也使用 class-head-name)。


以下内容并不直接适用于您的示例,但我发现值得一提。

请注意,上面的引用指的是类模板(或显式特化)定义,而不是诸如

的声明
template<class _> struct Derived::Inner<int, _>;

句法上,struct Derived::Inner<int, _>其中有一个 elaborated-type-specifier,上面的段落对其不适用。因此,标准措辞在技术上允许此类声明。

这似乎不是疏忽:上面的措辞是由DR284决议引入的。 ,其中包括评论:

The sentiment was that this should be required on class definitions, but not on elaborated type specifiers in general (which are references, not declarations). [...]

提议的决议包括精心设计的类型说明符,但这些已从最终措辞中删除。

但是,MSVC 和 EDG 都不接受此类声明(坦率地说,如果他们接受,我会觉得很困惑)。 DR 中的评论似乎表明其意图是仅允许精心设计的类型说明符 不是声明,但看起来这并没有反射(reflect)在措辞中(一个标准错误,我认为)。

关于c++ - 继承嵌套模板类的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38215737/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com