child class 可以使用模板 parent 的静态方法吗?

Can child class use a template parent's static methods?

我有一个模板 parent class 和多个 child class。我想制作一个静态方法,它接受任何 child class 和 returns 一个 child class,但我想把它写在 parent class,这样我就不用为每个child手动写了。我怎么做?我有:

#include<iostream>

using namespace std;

template<typename T>
class Parent
{
public:
    T x;
    T y;

    static Parent Inverse(Parent* A)
    {
        Parent B;
        B.x = -(A->x);
        B.y = -(A->y);
        return B;
    }
};

class Child1 : public Parent<int>{
};

class Child2 : public Parent<float>{
};

class ChildN : public Parent<double>{
};

int main()
{
    Child2 A;
    A.x = 3.14;
    A.y = 15.92;
    Child2 B = Child2::Inverse(&A);
    cout << B.x << " : " << B.y << endl;
}

我收到错误“请求从 'Parent' 转换为 non-scalar 类型 'Child2'。 我试着这样做:

Child2 B = Child2::Inverse<float>(&A);

然后我得到“预期 primary-expression 之前 'float'。 我也试过:

Child2 B = Parent<float>::Inverse(&A);

然后我得到与第一次“从 'Parent' 到 non-scalar 类型 'Child2' 请求的转换”相同的错误。

如果我为每个 child 编写静态方法,它就可以正常工作。但我想知道我做错了什么。

考虑声明...

Child2 B = Child2::Inverse(&A);

Child2::Inverse 具有 return 类型 Parent,因此您试图将 Parent 隐式转换为 Child2。那不行。

一种选择是使用 CRTP 将子类名称注入 Parent...

template<typename P, typename T>
class Parent
{
public:
  T x;
  T y;

  static P Inverse(Parent* A)
    {
      P B;
      B.x = -(A->x);
      B.y = -(A->y);
      return B;
    }
};

其中模板参数P表示子类的名称。然后可以用作...

class Child1 : public Parent<Child1, int>{
};

class Child2 : public Parent<Child2, float>{
};

class ChildN : public Parent<ChildN, double>{
};

int main()
{
  Child2 A;
  A.x = 3.14;
  A.y = 15.92;
  Child2 B = Child2::Inverse(&A);
  std::cout << B.x << " : " << B.y << std::endl;
}