ホームページ > バックエンド開発 > C++ > C テンプレート クラスのメンバー関数を明示的に特殊化すると、「名前空間以外のスコープ」エラーが発生するのはなぜですか?

C テンプレート クラスのメンバー関数を明示的に特殊化すると、「名前空間以外のスコープ」エラーが発生するのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-04 06:15:17
オリジナル
1029 人が閲覧しました

Why Does Explicit Specialization of a Member Function in a C   Template Class Cause a

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

クエリ:

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート