gcc 和非命名空间范围内的显式专业化

mkm*_*afa 7 c++ templates c++17

struct X\n{\n    template <typename>\n    struct Y;\n\n    template <>\n    struct Y<int>\n    {\n    };\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

此代码无法使用 GCC (甚至 GCC 10 Link)进行编译,并出现以下错误消息

\n\n
error: explicit specialization in non-namespace scope \'struct X\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

根据cpp参考

\n\n
Explicit specialization may be declared in any scope where its primary template may be defined\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们还有此缺陷报告,其中行为已更改以允许此代码编译CWG 727

\n\n

然而在这个问题上有一些评论

\n\n
\n

到目前为止,这似乎还没有解决,gcc 开发人员声称 cwg727 从未获得批准。\xe2\x80\x93 斯威夫特 - Friday Pie Nov 22 \'19 at 19:11

\n
\n\n

表示这份缺陷报告未获批准。真的吗?这是 gcc bug 不符合标准吗?

\n

Cha*_*ria 1

这是 gcc 未能遵守标准,但是(正如链接问题中所讨论的)2018 年有一个错误报告,所以希望它能够得到修复。

作为问题的解决方案,部分模板专业化可以正常工作,因此您只需添加一个虚拟模板参数即可。

struct X
{
    template <typename, typename=int>
    struct Y;

    template <typename DUMMY_T>
    struct Y<int, DUMMY_T>
    {
    };
};
Run Code Online (Sandbox Code Playgroud)

它位于编译器资源管理器中。