In template class CConstraint, an explicit specialization of the Verify member function for int is defined outside of the namespace of the class. This causes an error in g due to a violation of C standards.
According to C 03 §14.7.3/2, explicit specializations must be declared in the namespace of which the template is a member or, for member templates, in the namespace of which the enclosing class or enclosing class template is a member.
To resolve this issue, the explicit specialization of Verify for int must be declared within the namespace of CConstraint. This can be achieved by using the following modified code:
<br>template<typename T><br>class CConstraint<br>{<br>public:</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><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[]) { }
};
Additionally, since explicit specializations of member functions require explicit specialization of the containing class, a better solution would be to move the Verify function out of the class and into a separate namespace:
<br>namespace detail<br>{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">template <typename TL> void Verify(int position, int constraints[]) { } template <> void Verify<int>(int position, int constraints[]) { }
}
template
class CConstraint
{
// ... template <typename TL> void Verify(int position, int constraints[]) { detail::Verify<TL>(position, constraints); }
};
The above is the detailed content of Why Does Explicit Specialization of a Member Function Outside its Namespace Cause a C Compilation Error?. For more information, please follow other related articles on the PHP Chinese website!