ホームページ >バックエンド開発 >C++ >テンプレート化されたクラスのメンバー関数を正しく明示的に特殊化するにはどうすればよいですか?

テンプレート化されたクラスのメンバー関数を正しく明示的に特殊化するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-03 01:33:14113ブラウズ

How to Correctly Explicitly Specialize Member Functions in Templated Classes?

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

クラス テンプレートを使用する場合、メンバー関数の明示的な特殊化は一般的な要件です。ただし、クラス テンプレート自体がテンプレートになる場合、間違ったアプローチによりエラーが発生する可能性があります。

次のシナリオを考えてみましょう:

template <class C> class X
{
public:
   template <class T> void get_as();
};

template <class C>
void X<C>::get_as<double>()
{
}

このコードは、メンバーを明示的に特殊化しようとします。 double型のクラステンプレートXの関数。ただし、X 自体がテンプレートになると、コンパイラーは次のエラーを報告します。

error: template-id 'get_as<double>' in declaration of primary template
error: prototype for 'void X<C>::get_as()' does not match any in class 'X<C>'

解決策は、周囲のクラス テンプレートも明示的に特殊化することです。これは、特殊なメンバー定義に空のテンプレート引数を追加することで実行できます:

template <> template <>
void X<int>::get_as<double>()
{
}

これにより、メンバー関数が X のみに特殊化されます。

あるいは、次のように使用することもできます。目的の動作を実現するためのオーバーロード:

template <class C> class X
{
   template<typename T> struct type { };

public:
   template <class T> void get_as() {
     get_as(type<T>());
   }

private:
   template<typename T> void get_as(type<T>) {
   }

   void get_as(type<double>) {
   }
};

このアプローチは、テンプレートの特殊化に依存して適切な動作を選択します。 get_as() オーバーロード。double 型の特殊化が意図したとおりに適用されるようにします。

以上がテンプレート化されたクラスのメンバー関数を正しく明示的に特殊化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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