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;
}
我有一个模板 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;
}