是否可以将重载提取运算符与重载算术运算符级联? 我试图在C++中实现一个类复合体,并重载算术运算符以及'''运算符的输入/输出。单独或级联时,算术运算符的工作方式与预期相同,但在尝试执行以下语句时,我无法获得正确的结果: cout &lt&lt "something" &lt&lt complex1 + complex2 &lt&lt "\n";

是否可以将重载提取运算符与重载算术运算符级联? 我试图在C++中实现一个类复合体,并重载算术运算符以及'''运算符的输入/输出。单独或级联时,算术运算符的工作方式与预期相同,但在尝试执行以下语句时,我无法获得正确的结果: cout &lt&lt "something" &lt&lt complex1 + complex2 &lt&lt "\n";,c++,overloading,operator-keyword,insertion,C++,Overloading,Operator Keyword,Insertion,其中complex1和complex2是COMPLEX类的对象 类定义的片段: class COMPLEX{ int a; // Real part int b; // Imaginary part public: COMPLEX operator = (COMPLEX ); COMPLEX operator + (COMPLEX ) const; friend istream& operator &gt&gt (istream

其中complex1和complex2是COMPLEX类的对象

类定义的片段:

class COMPLEX{
    int a;  // Real part
    int b;  // Imaginary part
public:
    COMPLEX operator = (COMPLEX );
    COMPLEX operator + (COMPLEX ) const;
    friend istream& operator &gt&gt (istream &, COMPLEX &);
    friend ostream& operator &lt&lt (ostream &, COMPLEX &);
-snip-
}


COMPLEX COMPLEX::operator = (COMPLEX t_c) {
    return COMPLEX(a = t_c.a, b = t_c.b);
}

COMPLEX COMPLEX::operator + (COMPLEX t_c) const{
    return COMPLEX(a + t_c.a, b + t_c.b);
}

istream& operator &gt&gt (istream &i_s, COMPLEX &t_c){
    i_s &gt&gt t_c.a &gt&gt t_c.b;
    return i_s;
}

ostream& operator &lt&lt (ostream &o_s, COMPLEX &t_c){
    o_s &lt&lt t_c.a &lt&lt "+" &lt&lt t_c.b &lt&lt "i";
    return o_s;
}
除此之外,我还重载了操作符


当我试图级联重写你的
cout
语句时

cout << "something" << (complex1 + complex2) << "\n";

cout您的操作符问题是您的流插入操作符被定义为

friend ostream& operator << (ostream &, COMPLEX &);
a+b
的值是右值,而不是左值,因为它是函数
运算符+
返回的值。在C++中,不能将引用绑定到rValf,因为这样您可以做这样的坏事:

COMPLEX& c = a + b; // This step isn't legal
c = 137;            // Wait, what object did we just change?
这里的问题是,如果我们可以将引用
c
绑定到
a+b
返回的临时对象,那么我们可以使用该引用对该对象进行更改。但是这没有任何意义-
a+b
是表达式的值,而不是实际对象


这和这里发生的问题是一样的。您的
操作员您的问题是该操作员!我以前试过,它确实有效。但我想知道我们是否可以执行像cout-Oops这样的操作!我试过你的方法。。仍然不起作用。结果是像以前一样将类型转换为int。我能做到这一点的唯一方法是将结果分配给第三个复杂类型的对象,然后完成它。非常感谢:)这正是我想要的解释
cout << a + b << endl;
COMPLEX& c = a + b; // This step isn't legal
c = 137;            // Wait, what object did we just change?
friend ostream& operator<< (ostream& out, const COMPLEX& c);