命名空间范围外的显式专业化:非标准 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中文网其他相关文章!