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

时间:2017-02-06 21:55:42

标签: c++ templates template-specialization

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

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”。

专用模板类是否有办法访问原始类成员而不会将代码与新的专用类型重复?或者任何其他方式来实现我在这里要做的事情?

2 个答案:

答案 0 :(得分:1)

  

这样我就可以拨打电话:

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;
};

答案 1 :(得分:1)

或者,您可以只专注一种方法,例如:

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;
}

Demo