ホームページ > バックエンド開発 > C++ > C の名前空間外でクラス メンバーの明示的な特殊化が失敗するのはなぜですか?

C の名前空間外でクラス メンバーの明示的な特殊化が失敗するのはなぜですか?

Susan Sarandon
リリース: 2024-12-06 04:49:21
オリジナル
258 人が閲覧しました

Why Does Explicit Specialization of Class Members Fail Outside a Namespace in C  ?

名前空間スコープ外の明示的な特殊化: 非標準 G のエラー

C テンプレート プログラミングには、コードを効率化するためのクラス メンバーの明示的な特殊化が含まれます世代。ただし、次のコード スニペットに示されているように、明示的な特殊化の配置は重要です:

template<typename T>
class CConstraint
{
    // ...

    template <typename TL>
    void Verify(int position, int constraints[])
    {
    }

    template <>
    void Verify<int>(int, int[])
    {
    }
};
ログイン後にコピー

g を使用してコンパイルすると、このコードはエラーになります:

Explicit specialization in non-namespace scope 'class CConstraint'
ログイン後にコピー

理解するにはこのエラーが発生した場合は、C 標準を調べる必要があります。C 標準では、テンプレートがメンバーとなっている名前空間内で明示的な特殊化を宣言する必要があると規定されています。上記の例では、CConstraint は名前空間内で宣言されていないため、Verify の明示的な特殊化は行われません。は無効です。

VC コンパイラは、この場合は準拠していないため、名前空間スコープ外での明示的な特殊化が許可されます。この動作は標準ではないため、依存しないでください。

解決策:

この問題を解決し、C 標準への準拠を保証するには、明示的な特殊化を宣言する必要があります。専門のテンプレートと同じ名前空間内で。コードの修正バージョンは次のとおりです。

namespace MyNamespace
{
    template<typename T>
    class CConstraint
    {
        // ...

        template <typename TL>
        void Verify(int position, int constraints[])
        {
        }

        template <>
        void Verify<int>(int, int[])
        {
        }
    };
}
ログイン後にコピー

CConstraint を MyNamespace 名前空間内にカプセル化することで、明示的な特殊化もその名前空間内で宣言されるようになり、コンパイル エラーが解決されます。

さらに、C 03 では、含まれるクラスを明示的に特殊化せずにメンバー関数を特殊化することが禁止されているため、提供されているセクションで提案されているように、自由関数のアプローチを使用することも検討できます。答え:

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 までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート