首页 > 后端开发 > C++ > 为什么类成员的显式特化在 C 中的命名空间之外失败?

为什么类成员的显式特化在 C 中的命名空间之外失败?

Susan Sarandon
发布: 2024-12-06 04:49:21
原创
267 人浏览过

Why Does Explicit Specialization of Class Members Fail Outside a Namespace in C  ?

命名空间范围外的显式专业化:非标准 G 中的错误

C 模板编程涉及类成员的显式专业化,以实现高效代码一代。然而,显式专业化的放置至关重要,如以下代码片段所示:

template<typename T>
class CConstraint
{
    // ...

    template <typename TL>
    void Verify(int position, int constraints[])
    {
    }

    template <>
    void Verify<int>(int, int[])
    {
    }
};
登录后复制

当使用 g 编译时,此代码会导致错误:

Explicit specialization in non-namespace scope 'class CConstraint'
登录后复制

要理解对于此错误,我们需要检查 C 标准,该标准规定必须在模板所属的命名空间内声明显式专业化。在上面的示例中,CConstraint 未在任何名称空间内声明,因此,Verify 的显式特化是有效的。无效。

然而,VC 编译器在这种情况下是不兼容的,允许在命名空间范围之外进行显式专业化。此行为是非标准的,不应依赖。

解决方案:

要解决此问题并确保符合 C 标准,必须声明显式专业化与它们专门的模板位于同一名称空间内。下面是代码的更正版本:

namespace MyNamespace
{
    template<typename T>
    class CConstraint
    {
        // ...

        template <typename TL>
        void Verify(int position, int constraints[])
        {
        }

        template <>
        void Verify<int>(int, int[])
        {
        }
    };
}
登录后复制

通过将 CConstraint 封装在 MyNamespace 命名空间中,我们确保其显式专业化也在该命名空间中声明,从而解决了编译错误。

此外,由于 C 03 禁止在没有显式专门化包含类的情况下专门化成员函数,因此我们还可以考虑使用自由函数方法,如提供的中所建议的答案:

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板