请参阅以下代码:
namespace ns {
template <typename T>
void func() {}
}
template <>
void ns::func<int>() {}
int main() {}
虽然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() {}
^
那么,标准对此有何看法?谁是对的?
答案 0 :(得分:6)
14.7.3 Explicit Specialization [temp.expl.spec]
应在包含的名称空间中声明显式特化 专业模板。一个明确的专业化 declarator-id 不合格,应在最近的声明 封闭模板的命名空间,或者,如果命名空间是内联的 (7.3.1),来自其封闭命名空间集的任何命名空间。这样的 声明也可以是一个定义。如果声明不是 定义,专业化可以在以后定义(7.3.1.2)。
判决:您的专业化是显式专业化,它是限定,这意味着该代码段是合法的。因此, clang 显示的行为是正确的。
gcc 的相关错误报告: