首页 >后端开发 >C++ >为什么 C 模板类中成员函数的显式特化会导致'非命名空间作用域”错误?

为什么 C 模板类中成员函数的显式特化会导致'非命名空间作用域”错误?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-04 06:15:171054浏览

Why Does Explicit Specialization of a Member Function in a C   Template Class Cause a

非命名空间范围内的显式专业化

查询:

在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn