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

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

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

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();

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

"Use of undeclared identifier m_member".

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

So that I can make calls like:

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

The specialised template class won't compile, gives the error: "Use of undeclared identifier 'm_member'".

那是因为模板专业化与通用 class 模板无关。专业化需要的任何东西都必须在专业化中实现。如:

template<>
class MyTemplateClass<float>
{
   public:
      void DoSomething()
      {
         DoSomethingWithMember();
      }

      void DoSomethingWithMember()
      {
         printf("Member is %f", m_member);
      }

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

Demo