非命名空间范围内的显式专业化问题
在命名空间之外编译具有显式专业化的 C 类模板时,某些编译器(如 g)可能会引发错误,指出“非命名空间范围中的显式专业化”。出现此问题的原因是类模板及其成员函数的显式特化应驻留在模板声明的命名空间内。
显式特化的相关 C 03 标准(第 §14.7.3/2) 指定:
“应在模板所属的命名空间中声明显式专业化,或者,对于成员模板,应在封闭类或封闭类模板所属的命名空间。”
这意味着,Verify() 方法的显式特化应在声明 CConstraint 类的命名空间内声明。
此外,根据 C 03,§14.7.3/3,成员函数的显式特化需要外围函数的显式特化 班级。要解决此问题,请考虑将 verify() 方法转发到嵌套命名空间中的显式的、可能专门化的自由函数:
namespace detail { template <typename TL> void Verify(int, int[]) {} template <> void Verify<int>(int, int[]) {} } template<typename T> class CConstraint { // ... template <typename TL> void Verify(int position, int constraints[]) { detail::Verify<TL>(position, constraints); } };
通过将显式专门化封装在嵌套命名空间中,编译器会将其识别为属于模板的命名空间,解决了错误。
以上是为什么命名空间之外的显式专业化会导致 C 中的编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!