gpt4 book ai didi

c++ - 运算符<< 重载。无法直接在 cout 中直接使用另一个重载运算符的结果

转载 作者:行者123 更新时间:2023-11-27 23:47:35 24 4
gpt4 key购买 nike

我正在制作一个复数类,以便处理重载运算符。

#include <iostream>
class Complex
{
double real;
double imaginary;

public:

Complex(double real, double imaginary) : real(real), imaginary(imaginary) {}
~Complex() = default;

friend std::ostream &operator<<(std::ostream &out, Complex &source)
{
out << "(" << source.real << " + " << source.imaginary << ")";
return out;
}

friend Complex operator+(const Complex &a, const Complex &b)
{
return Complex(a.real + b.real, a.imaginary + b.imaginary);
}

};

int main()
{
Complex c1(3, 2.25);
Complex c2(2.25, 3);
Complex res = c1 + c2;

std::cout << res;
return 0;
}

类定义还没有完成,我需要重载一些运算符。但是,如果我编译并运行该项目,我会按预期在屏幕上打印结果,但如果我不使用结果变量来打印 cout cout<< c1+c2;我收到以下错误:

error: no match for 'operator<<' (operand types are 'std::ostream {aka std::basic_ostream<char>}' and 'cmp::Complex')

如果我尝试使用 cout<< &(c1+c2);我收到错误消息:

error: taking address of temporary [-fpermissive]

我并不是有意这样写的。

我的印象是它失败了,因为 c1+c2 没有被用作引用,因为它是一个临时对象,没有保存在任何地方,而且由于根据第二个错误我无法引用临时对象,它失败。这解释了为什么当我将 c1+c2 的结果保存在 result 上时,我可以毫无错误地执行程序。

在我观看的视频中,使用了 Eclipse,在我的例子中,我使用了带有 GNU GCC 编译器的 Codeblocks。

你能帮我理解我做错了什么吗?为什么它在我的案例中不起作用,但在视频中使用相同的语法?

编辑:解决方案:<< 运算符函数应该采用 Complex 类型的 const 引用来代替。临时对象只能绑定(bind)到 const 引用。因此它的原型(prototype)应该是这样的......

friend ostream &operator<<(ostream &out,const Complex &source);

最佳答案

c1+c2 生成一个临时对象,它不能绑定(bind)到流运算符中的非常量引用。您需要将其更改为 const 引用

关于c++ - 运算符<< 重载。无法直接在 cout 中直接使用另一个重载运算符的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49357234/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com