テンプレート クラス foo のメンバー関数 bar を部分的に特殊化しようとすると、無効な型を示すエラーが発生する場合があります。不完全な型の使用。特に、次のコード スニペットではエラーが生成されます:
template <typename S, typename T> struct foo { void bar(); }; template <> void foo<int, T>::bar() { }
これは、コンパイラが、特殊化された関数定義に遭遇する前に、部分的に特殊化されたテンプレート クラスの完全な型を判断できないためです。この問題を解決するには、以下に示すように、テンプレート クラス全体を部分的に特殊化する必要があります。
template <typename S, typename T> struct foo { void bar() { // If S is not int, do default behavior for non-int S if constexpr(!std::is_same<S, int>::value) { // Default behavior } // If S is int, do specialized behavior unique to int else { // Int-specific behavior } } };
テンプレート クラス全体を部分的に特殊化することで、コンパイラーは特定の関数定義に到達する前に完全な型を推論できます。これにより、特殊化された関数が、新しく導入された特殊化に固有のメンバーにアクセスして変更できるようになります。
以上がテンプレート メンバー関数の部分特殊化が不完全型エラーで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。