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

时间:2015-10-10 17:34:54

标签: c++ namespaces language-lawyer c++14 template-specialization

请参阅以下代码:

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() {}
      ^

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

1 个答案:

答案 0 :(得分:6)

标准(n3797)说什么?

14.7.3    Explicit Specialization    [temp.expl.spec]
     
    

应在包含的名称空间中声明显式特化     专业模板。一个明确的专业化      declarator-id 不合格,应在最近的声明     封闭模板的命名空间,或者,如果命名空间是内联的     (7.3.1),来自其封闭命名空间集的任何命名空间。这样的     声明也可以是一个定义。如果声明不是     定义,专业化可以在以后定义(7.3.1.2)。

  

判决:您的专业化是显式专业化,它是限定,这意味着该代码段是合法的。因此, clang 显示的行为是正确的。

gcc 的相关错误报告: