テンプレート クラス CConstraint では、int の Verify メンバー関数の明示的な特殊化がクラスの名前空間の外部で定義されています。これにより、C 標準の違反により g でエラーが発生します。
C 03 §14.7.3/2 によれば、明示的な特殊化は、テンプレートがメンバーである名前空間、またはメンバーの名前空間で宣言する必要があります。
この問題を解決するには、Verify for int を明示的に特殊化します。 CConstraint の名前空間内で宣言する必要があります。これは、次の変更コードを使用して実現できます:
<br>template<typename T><br>class CConstraint<br>{<br>public:</p> <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>{</p> <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 中国語 Web サイトの他の関連記事を参照してください。