我有两个类,Base和Derived。 Base定义了一个运算符(这里是operator +),我想在Derived类的实例之间使用它,但是我无法设法解决这个问题。
这里有一些解释问题的最小代码:
class Base{
public:
Base(int X){ x = X; }
Base operator+(const Base& rhs){
return Base(x + rhs.x);
}
int x;
};
class Derived : public Base{
public:
using Base::Base;
};
int main(){
Derived der1(0);
Derived der2(0);
Derived der3 = der1 + der2;
return 0;
}
编译器说:
main.cpp: In function ‘int main()’:
main.cpp:21:23: error: conversion from ‘Base’ to non-scalar type ‘Derived’ requested
Derived der3 = der1 + der2;
Derived类不需要具有除Base继承的属性之外的任何属性。
谢谢!
答案 0 :(得分:1)
这是重复出现的模板模式的常见用例。一个例子是
template<typename T>
class Base
{
public:
Base(int X) { x = X; }
friend T operator+(const Base& lhs, const Base& rhs)
{
return T(lhs.x + rhs.x);
}
int x;
};
class Derived : public Base<Derived>
{
public:
Derived(int arg) : Base(arg) { }
using Base::Base;
};
int main()
{
Derived der1(1);
Derived der2(2);
Derived der3 = der1 + der2;
return 0;
}
这就像so。
朋友名称注入(或Barton Nackman技巧)用于在模板化类型的实例化时生成函数。以上是设计可能的粗略草图,但我应该引导您完成调用+运算符的过程。
der1
和der2
转换为对基类的引用+
的主体(即使它位于不同的命名空间中,依赖于参数的查找会启动,我们会有解决方案)运算符构造一个T
,在这种情况下,其总和为Derived
(lhs.x + rhs.x)
该对象用于初始化der3