使用类模板时,成员函数的显式特化是一个常见的要求。但是,在类模板本身成为模板的情况下,可能会因不正确的方法而出现错误。
考虑以下场景:
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()重载,确保按预期应用双精度类型特化。
以上是如何正确显式地特化模板类中的成员函数?的详细内容。更多信息请关注PHP中文网其他相关文章!