Explicit Specialization in Non-Namespace Scope
Query:
In a C template class CConstraint, why does the compiler generate the error "Explicit specialization in non-namespace scope" when a member function is explicitly specialized?
Response:
The issue arises because the explicit specialization in CConstraint is not declared within a namespace. According to the C 03 standard, section 14.7.3/2, explicit specializations must reside within the template's namespace or, for member templates, within the namespace of the enclosing class or class template.
Furthermore, C 03 section 14.7.3/3 restricts the explicit specialization of member functions unless the containing class itself is explicitly specialized.
Solution:
To resolve this issue, one approach is to forward the Verify() member function to a specialized free function defined within a separate namespace, as shown below:
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); } };
The above is the detailed content of Why Does Explicit Specialization of a Member Function in a C Template Class Cause a 'Non-Namespace Scope' Error?. For more information, please follow other related articles on the PHP Chinese website!