ホームページ >バックエンド開発 >C++ >名前空間外の明示的な特殊化により C でコンパイル エラーが発生するのはなぜですか?

名前空間外の明示的な特殊化により C でコンパイル エラーが発生するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-02 02:13:09708ブラウズ

Why Do Explicit Specializations Outside a Namespace Cause Compilation Errors in C  ?

非名前空間スコープでの明示的な特殊化の問題

名前空間の外で明示的な特殊化を使用して 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。