没有发现哪个操作员采用类型' B' (或者没有可接受的转换)

时间:2015-09-03 05:58:18

标签: c++

我有以下代码。我试图打印两个对象的总和,但编译器给出了以下错误:

binary '<<' : No operator found which takes a right-hand operand of type 'B' (or there is no acceptable conversion)

我真的不明白错误的含义。为什么说运营商&lt;&lt;需要一个类型&#39; B&#39;。那不是两个总和的总和吗?

#include <iostream>
using namespace std;

class A
{
    protected:
        int x;

    public:
        A(int i) :x(i) {}
        int get_x() {
            return x;
        }
};

class B : public A
{
    public:
        B(int i) :A(i) {}
        B operator+(const B& b) const {
            return x + b.x;
        }
};

int main()
{
    const B a(22), b(-12);
    cout << a + b;
    system("Pause");
}

4 个答案:

答案 0 :(得分:1)

a + b表达式正在使用您的自定义运算符 - 所以它就好像您已经写好了(模块常量 - 我只是试图了解什么&#39;继续):

B c = a + b;
cout << c;

这不起作用,因为编译器找不到合适的<<运算符,而B作为正确的操作数 - 就像错误消息所说的那样。值得问问自己,你对它的期望是什么。

如果要在结果中打印x的值,可能需要:

cout << (a + b).get_x();

答案 1 :(得分:1)

只是重载&lt;&lt;操作者:

std::ostream& operator<<(std::ostream& out, const B& b)
{
    return out << b.x;
}

答案 2 :(得分:1)

operator <<课程中添加B定义。像

这样的东西
class B : public A {
    public: B(int i) : A(i) {}

    B operator +(const B & b) const { return x + b.x; }

    friend std::ostream & operator <<(std::ostream & out, const B & obj) {
        out << obj.x;
        return out;
    }
};

答案 3 :(得分:-1)

可以这样做:

#include<iostream>
using namespace std;

class A
{
        protected: int x;
        public: A(int i) :x(i) {}
                int get_x() { return x; }
};

class B : public A
{
public: B(int i) :A(i) {}
        B operator+(const B& b) const { return x + b.x; }
};

ostream & operator << (ostream &object,B &data)
{
    object << data.get_x();
    return object;
}

int main()
{
    const B a(22), b(-12);
    cout << (a + b);
    system("Pause");
}