具有显式专业化成员函数的模板类
为类模板的成员函数定义显式专业化时,会出现一个常见的陷阱:周围的类模板也是一个模板。要理解这个问题,请考虑以下示例:
#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中文网其他相关文章!