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)
那么,标准对此有何看法?谁是对的?
Run Code Online (Sandbox Code Playgroud)14.7.3 Explicit Specialization [temp.expl.spec]应在包含专用模板的命名空间中声明显式特化.其声明者id未限定的显式特化 应在模板的最近的封闭命名空间中声明,或者,如果命名空间是内联(7.3.1),则从其封闭的命名空间集中声明任何命名空间.这样的声明也可以是一个定义.如果声明不是定义,则可以稍后定义专业化(7.3.1.2).
判决:您的专业化是一种明确的专业化,它是合格的,这意味着该片段是合法的.因此,clang显示的行为是正确的.
gcc的相关错误报告:
| 归档时间: |
|
| 查看次数: |
393 次 |
| 最近记录: |