当函数模板专用于不同的命名空间时,GCC和clang不同意

Lin*_*gxi 5 c++ namespaces template-specialization language-lawyer c++14

请参阅以下代码:

namespace ns {

template <typename T>
void func() {}

}

template <>
void ns::func<int>() {}

int main() {}
Run Code Online (Sandbox Code Playgroud)

虽然clang 3.6(C++ 14)编译得很好,但GCC 5.2(C++ 14)会抛出以下错误

main.cpp:9:20: error: specialization of 'template<class T> void ns::func()' in different namespace [-fpermissive]
 void ns::func<int>() {}
                    ^
main.cpp:4:6: error:   from definition of 'template<class T> void ns::func()' [-fpermissive]
 void func() {}
      ^
Run Code Online (Sandbox Code Playgroud)

那么,标准对此有何看法?谁是对的?

Fil*_*efp 6

标准(n3797)说什么?

14.7.3    Explicit Specialization    [temp.expl.spec]
Run Code Online (Sandbox Code Playgroud)

应在包含专用模板的命名空间中声明显式特化.其声明者id未限定的显式特化 应在模板的最近的封闭命名空间中声明,或者,如果命名空间是内联(7.3.1),则从其封闭的命名空间集中声明任何命名空间.这样的声明也可以是一个定义.如果声明不是定义,则可以稍后定义专业化(7.3.1.2).

判决:您的专业化是一种明确的专业化,它是合格的,这意味着该片段是合法的.因此,clang显示的行为是正确的.


gcc的相关错误报告: