【问题标题】:Explicit specialization in non-namespace scope does not compile in GCC非命名空间范围内的显式特化在 GCC 中不编译
【发布时间】:2018-09-17 07:57:26
【问题描述】:

以下代码在 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

【问题讨论】:

  • 您能否编辑您的问题以包含 GCC 的完整输出?
  • @Someprogrammerdude 完成

标签: c++ templates gcc language-lawyer bug-reporting


【解决方案1】:

这应该是 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

【讨论】:

  • 这是一个很大的变化,不再需要默认的哑模板参数技巧来模拟显式模板专业化:)!!
  • 你能澄清哪些标准改变了它吗? C++17?
  • @HolyBlackCat 是的,它自 C++17 以来发生了变化。您可以查看 C++14(draft N4140) 和 C++17(draft N4659) 中的不同描述。
  • @cppBeginner 我觉得用的是gcc;是的,Gcc 仍然没有解决这个问题; clang 工作正常。
  • 到目前为止,这似乎还没有解决,gcc dev 声称 cwg727 从未获得批准。
猜你喜欢
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 2020-10-12
相关资源
最近更新 更多