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

C の非名前空間スコープのテンプレート クラスでテンプレート関数の明示的な特殊化が失敗するのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-30 21:37:12143ブラウズ

Why Does Explicit Specialization of Template Functions Fail in Non-Namespace-Scoped Template Classes in C  ?

C のテンプレート クラスのテンプレート関数の明示的な特殊化

エラー:

開発者が試行しています名前空間をスコープとしないテンプレート クラス内のテンプレート関数を明示的に特殊化すると、コンパイル エラーが発生する可能性があります。 GCC。次のコードはこのような問題を示しています。

struct tag {};

template< typename T >
struct C
{   
    template< typename Tag >
    void f( T );                 // declaration only

    template<>
    inline void f< tag >( T ) {} // ERROR: explicit specialization in
};                               // non-namespace scope 'structC<T>'

解決策:

メンバー関数の明示的な特殊化は、名前空間スコープではないテンプレート クラスではサポートされていません。代わりに、部分的に特殊化された中間型のメンバー関数に呼び出しを転送することを検討してください。

template<class T, class Tag>
struct helper {
    static void f(T);   
};

template<class T>
struct helper<T, tag1> {
    static void f(T) {}
};

template<class T>
struct C {
    // ...
    template<class Tag>
    void foo(T t) {
        helper<T, Tag>::f(t);
    }
};

このアプローチでは、部分的なテンプレートの特殊化を利用して、GCC の構文要件を遵守しながら目的の動作を実現します。

以上がC の非名前空間スコープのテンプレート クラスでテンプレート関数の明示的な特殊化が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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