非名前空間スコープでの明示的な特殊化の問題
名前空間の外で明示的な特殊化を使用して C クラス テンプレートをコンパイルすると、g のような一部のコンパイラが「非名前空間スコープでの明示的な特殊化」というエラーが発生する場合があります。この問題は、クラス テンプレートとそのメンバー関数の明示的な特殊化がテンプレートの宣言の名前空間内に存在する必要があるために発生します。
明示的な特殊化に関連する C 03 標準 (セクション §14.7.3/2) は次のように指定します:
「明示的な特殊化は、テンプレートがメンバーである名前空間で宣言されるものとする。または、メンバー テンプレートの場合、外側のクラスまたは外側のクラス テンプレートがメンバーである名前空間内にあります。これは、Verify() メソッドの明示的な特殊化が、CConstraint クラスが存在する名前空間内で宣言される必要があることを意味します。 さらに、C 03、§14.7.3/3 によれば、明示的です。メンバー関数の特殊化には、それを囲んでいるクラスの明示的な特殊化が必要です。これを解決するには、Verify() メソッドを、ネストされた名前空間内の明示的で潜在的に特殊化された自由関数に転送することを検討してください。
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 サイトの他の関連記事を参照してください。