クラス テンプレートを使用する場合、メンバー関数の明示的な特殊化は一般的な要件です。ただし、クラス テンプレート自体がテンプレートになる場合、間違ったアプローチによりエラーが発生する可能性があります。
次のシナリオを考えてみましょう:
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 サイトの他の関連記事を参照してください。