17

以下代码在 Clang 中编译,但在 GCC 中不编译:

template<typename T>
struct Widget
{
    template<typename U>
    void foo(U)
    {
    }

    template<>
    void foo(int*)
    {
    }
};

根据 C++ 标准([temp.expl.spec],第 2 段):

可以在可以定义相应主模板的任何范围内声明显式特化

这是 GCC 中的错误吗?如果是,我如何在其错误跟踪器中找到它?

这是 GCC 的输出:

prog.cc:13:14: error: explicit specialization in non-namespace scope 'struct Widget<T>'
     template<>
              ^

我正在使用 GCC HEAD 8.0.1,带有-std=c++2a.

4

1 回答 1

19

这应该是一个 GCC 错误。在任何范围内都应允许完全专业化,包括在类定义中。

根据CWG 727, [temp.expl.spec] 第 2 段从

(强调我的)

显式特化应在包含特化模板的命名空间中声明。declarator-id 或 class-head-name 未限定的显式特化应在模板的最近的封闭命名空间中声明,或者,如果命名空间是内联的(10.3.1 [namespace.def]),则应在模板的任何命名空间中声明封闭的命名空间集。这样的声明也可以是一个定义。如果声明不是定义,则可以稍后定义特化(10.3.1.2 [namespace.memdef])。

(强调我的)

可以在可以定义相应主模板的任何范围内声明显式特化(10.3.1.2 [namespace.memdef]、12.2 [class.mem]、17.6.2 [temp.mem])。

GCC 似乎没有遵循这一点。

编辑

我已将此问题报告为Bug 85282

于 2018-04-07T12:26:16.477 回答