如何在C++的专用模板类中访问模板类成员字段

How do I access a template class member field in a specialised template class in C++?

本文关键字:访问 成员 字段 专用 C++      更新时间:2023-10-16

我正在尝试编写一个模板类,该模板类具有传递类型的成员,该成员应该用于专用模板类的方法。喜欢这个:

template <class T>
class MyTemplateClass
{
public:
    MyTemplateClass() {}
    void DoSomething()
    {
        DoSomethingWithMember();
    }
    void DoSomethingWithMember() {}
protected:
    T m_member;
};
template<>
class MyTemplateClass<float>
{
public:
    void DoSomethingWithMember()
    {
        printf("Member is %f", m_member);
    }
};

这样我就可以拨打这样的电话:

MyTemplateClass<float> obj2 = MyTemplateClass<float>();
obj2.DoSomething();

专用模板类无法编译,并给出错误:

"使用未声明的标识符m_member"。

有没有办法让专用模板类访问原始类成员,而无需使用新的专用类型复制代码?或者任何其他方法可以实现我在这里尝试做的事情?

或者,您可以只专门研究一种方法,例如:

template <class T>
class MyTemplateClass
{
public:
    MyTemplateClass(T t) : m_member(t) {}
    void DoSomething() { DoSomethingWithMember(); }
    void DoSomethingWithMember();
protected:
    T m_member;
};
// **Fully** Specialize DoSomethingWithMember for float.
template <>
void MyTemplateClass<float>::DoSomethingWithMember()
{
    std::cout << "Member is " << m_member;
}

演示

这样我就可以拨打这样的电话:

MyTemplateClass<float> obj2 = MyTemplateClass<float>();
obj2.DoSomething();

专用模板类不会编译,给出错误:"使用未声明的标识符'm_member'"。

这是因为模板专用化与泛型类模板无关。专业化需要的任何事情都必须在专业化中实现。如:

template<>
class MyTemplateClass<float>
{
   public:
      void DoSomething()
      {
         DoSomethingWithMember();
      }
      void DoSomethingWithMember()
      {
         printf("Member is %f", m_member);
      }
      float m_member;
};