首页 >后端开发 >C++ >为什么在其命名空间之外对成员函数进行显式特化会导致 C 编译错误?

为什么在其命名空间之外对成员函数进行显式特化会导致 C 编译错误?

Susan Sarandon
Susan Sarandon原创
2024-12-04 11:56:11687浏览

Why Does Explicit Specialization of a Member Function Outside its Namespace Cause a C   Compilation Error?

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

在模板类 CConstraint 中,int 的Verify 成员函数的显式专业化是在类的命名空间之外定义的。由于违反 C 标准,这会导致 g 中出现错误。

根据 C 03 §14.7.3/2,必须在模板所属的命名空间中声明显式特化,或者对于成员模板,位于封闭类或封闭类模板所属的命名空间中。

要解决此问题,必须在CConstraint 的命名空间。这可以通过使用以下修改后的代码来实现:

<br>template<typename t><br>class CConstraint<br>{<br>public:<pre class="brush:php;toolbar:false">CConstraint()
{
}

virtual ~CConstraint()
{
}

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

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

};

此外,由于成员函数的显式特化需要包含类的显式特化,更好的解决方案是将Verify函数移出类并放入一个单独的函数中命名空间:

<br>命名空间详细信息<br>{<pre class="brush:php;toolbar:false">template <typename TL>
void Verify(int position, int constraints[]) { }

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

}

模板
类CConstraint
{

// ...

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

};

以上是为什么在其命名空间之外对成员函数进行显式特化会导致 C 编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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