非名前空間スコープでの明示的な特殊化
クエリ:
C テンプレート クラス内CConstraint、コンパイラが「名前空間以外のスコープでの明示的な特殊化」というエラーを生成するのはなぜですかメンバー関数が明示的に特殊化されている場合?
応答:
この問題は、CConstraint の明示的な特殊化が名前空間内で宣言されていないために発生します。 C 03 標準のセクション 14.7.3/2 によると、明示的な特殊化はテンプレートの名前空間内、またはメンバー テンプレートの場合は、それを囲むクラスまたはクラス テンプレートの名前空間内に存在する必要があります。
さらに、C 03 セクション14.7.3/3 は、含まれるクラス自体が明示的に特殊化されていない限り、メンバー関数の明示的な特殊化を制限します。
解決策:
この問題を解決するには、Verify() メンバー関数を別の名前空間内で定義された特殊な無料関数に転送することが 1 つのアプローチです。以下に示す:
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 中国語 Web サイトの他の関連記事を参照してください。