首页 > 解决方案 > 如何解决此错误“请求从'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)的字段之间加法的操作..

标签: c++11

解决方案


看来您需要更多的构造函数。

我已经设法解决了这个错误:

的新构造函数D

D(const B& b): B(b), m(0){}

输出:

B: 4, B: 2, D: 2

我不确定为什么需要这个构造函数,但是没有它就没有从Bto的转换DB显然,正如您所指出的,不需要复制构造函数(我认为编译器会为您编写一个。)

该行:

D result = B::operator+(d);

调用上面的转换构造函数,而不是任何类型的赋值运算符。


推荐阅读