明示的に特殊化されたメンバー関数を含むテンプレート クラス
クラス テンプレートのメンバー関数に対して明示的に特殊化を定義する場合、次のような場合に一般的な落とし穴が発生します。周囲のクラステンプレートもテンプレートです。この問題を理解するために、次の例を考えてみましょう。
#include <iostream> #include <cmath> template <class C> class X { public: template <class T> void get_as(); }; template <class C> void X<C>::get_as<double>() {} // Explicit specialization for double int main() { X<int> x; x.get_as(); }
このコードは、X クラス テンプレートの double 用に get_as メンバー関数を明示的に特殊化しようとしています。ただし、周囲のクラス テンプレートが明示的に特殊化されていないため、このアプローチではコンパイラ エラーが発生します。
間違ったアプローチ:
クラスを特殊化せずにメンバー関数を明示的に特殊化しようとしました。以下に示すように、テンプレートは不正解:
template <class C> template<> void X<C>::get_as<double>() {}
正しい解決策:
問題を解決するには、クラス テンプレートとメンバー関数の両方を明示的に特殊化する必要があります。たとえば、get_as 関数を X
template <> template <class T> void X<int>::get_as() {} template <> void X<int>::get_as<double>() {}
代替オプション:
あるいは、周囲の要素を維持するには特殊化されていないクラス テンプレートでは、次のように get_as 関数のオーバーロードを使用できます。コード:
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>) {} };
以上がクラス テンプレートのメンバー関数を正しく明示的に特殊化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。