非命名空间作用域显式特化GCC不编译,是否为GCC Bug及如何查询?
关于类内成员模板显式特化的GCC编译问题
先来看你给出的代码:
template<typename T> struct Widget { template<typename U> void foo(U) { } template<> void foo(int*) { } };
结论:这确实是GCC的Bug
根据你引用的C++标准[temp.expl.spec]第2段规定:
显式特化可在对应主模板可定义的任意作用域中声明。
这里的主模板是Widget<T>::foo<U>,它的定义允许放在Widget类的内部,那么按照标准,它的显式特化foo<int*>也允许放在类内部。Clang的行为符合标准要求,而GCC报错拒绝编译,属于GCC的实现缺陷。
如何在GCC Bug追踪器中查找该问题
你可以通过以下步骤在GCC官方Bug追踪系统中确认这个问题:
- 进入GCC的Bugzilla平台(官方的bug跟踪工具)。
- 使用搜索关键词定位问题,比如可以用:
explicit specialization member template inside classerror: explicit specialization in non-namespace scope(直接用GCC给出的错误提示开头)
- 搜索后你会发现,这个问题已经被用户报告过,属于已知的未修复(或待修复)bug,社区已经确认它违反了C++标准。
临时解决方法
在GCC修复这个问题之前,你可以把成员模板的显式特化移到类外部来绕过编译错误:
template<typename T> struct Widget { template<typename U> void foo(U) { } }; // 类外部实现成员模板的显式特化 template<typename T> template<> void Widget<T>::foo(int*) { // 你的实现代码 }
内容的提问来源于stack exchange,提问作者rubix_addict
相关产品推荐
相关产品推荐

