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