首页 >后端开发 >C++ >如何正确显式地特化模板类中的成员函数?

如何正确显式地特化模板类中的成员函数?

Barbara Streisand
Barbara Streisand原创
2024-12-03 01:33:14107浏览

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()重载,确保按预期应用双精度类型特化。

以上是如何正确显式地特化模板类中的成员函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn