非命名空间范围内的显式专业化
查询:
在 C 模板类中CConstraint,为什么编译器会在以下情况下生成错误“非命名空间范围中的显式专业化”成员函数是显式特化的?
响应:
出现此问题的原因是 CConstraint 中的显式特化未在命名空间内声明。根据 C 03 标准第 14.7.3/2 节,显式专业化必须驻留在模板的命名空间内,或者对于成员模板,位于封闭类或类模板的命名空间内。
此外,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中文网其他相关文章!