c++11 - 如何解决此错误“请求从'B'转换为非标量类型'D'”?(试图在基类的字段之间做“运算符+”)
问题描述
给出以下代码:
class B {
private:
int n;
public:
B(int x) :
n(x) {
}
B operator+(const B& b) {
return B(n + b.n);
}
friend ostream& operator<<(ostream &out, const B& b) {
out << "B: " << b.n;
return out;
}
bool operator<(const B& rhs) const {
return n < rhs.n;
}
};
class D: public B {
double m;
public:
D() :
B(0), m(0) {
}
D(int x, int y) :
B(x), m(y) {
}
D operator+(const D& d) {
D result = B::operator+(d); // error
result.m = m + d.m;
return result;
}
friend ostream& operator<<(ostream &out, const D& d) {
out << static_cast<const B&>(d);
out << ", D: " << d.m;
return out;
}
};
int main() {
B b4(4);
D d1(1, 0), d2(1, 2), d3 = d1 + d2;
cout << b4 << ", " << d3 << endl;
return 0;
}
如何修复错误?
请求从“B”转换为非标量类型“D”
我的目的是做基类( B
)的字段之间加法的操作..
解决方案
看来您需要更多的构造函数。
我已经设法解决了这个错误:
的新构造函数D
:
D(const B& b): B(b), m(0){}
输出:
B: 4, B: 2, D: 2
我不确定为什么需要这个构造函数,但是没有它就没有从B
to的转换D
。B
显然,正如您所指出的,不需要复制构造函数(我认为编译器会为您编写一个。)
该行:
D result = B::operator+(d);
调用上面的转换构造函数,而不是任何类型的赋值运算符。
推荐阅读
- amazon-web-services - 如何自动化 Packer AMI 构建?
- user-interface - Vim 日光化色彩方案在 VS Code 集成终端中无法正确显示
- android - Okhttp 在使用 Etags 时不返回缓存的响应
- r - 从列表创建 RasterStack
- java - 如何在 Java 中发现打开的文件描述符?
- android - 我如何处理这两种情况的改造中的数据参数。如果成功为假且数据为空,则应用程序崩溃
- python-3.x - 比较在熊猫数据框中返回不正确的结果
- apache-spark - Spark 中的核心数与线程数
- python - 将一列更改为日期时间,但将其作为字符串
- c# - 如何从 WebView 中的页面获取数据?安卓 Xamarin