[英]Why does the compiler report "operator<< and operator>> recursive on all control paths will cause stack overflow "?
#include <iostream>
class fraction {
int n, d;
public:
fraction(){}
fraction(int n, int d) : n(n), d(d) {}
int getter() { return n, d; }
friend std::istream& operator>>(std::istream& stream, const fraction& a) {
stream >> a;
return stream;
}
friend std::ostream& operator<<(std::ostream& stream, const fraction& a) {
stream << a;
return stream;
}
friend fraction operator*(const fraction& a, const fraction& b) {
int pN = a.n * b.n;
int pD = b.n * b.d;
return fraction(pN, pD);
}
};
int main()
{
fraction f1;
std::cout << "Enter fraction 1: ";
std::cin >> f1;
fraction f2;
std::cout << "Enter fraction 2: ";
std::cin >> f2;
std::cout << f1 << " * " << f2 << " is " << f1 * f2 << '\n'; // note: The result of f1 * f2 is an r-value
return 0;
}
Compiling error says:编译错误说:
operator<< and operator>> recursive on all paths, function will cause a stack overflow
I don't know what this means.我不知道这是什么意思。 What does it mean by recursive on all paths and which function is gonna cause a stack overflow?在所有路径上递归是什么意思,哪个函数会导致堆栈溢出?
When you run:当你运行时:
stream >> a;
You are calling the same function you are running, ie friend std::istream& operator>>(std::istream& stream, const fraction& a)
.您正在调用正在运行的相同函数,即friend std::istream& operator>>(std::istream& stream, const fraction& a)
。
So you will be calling yourself ( recursion ) again, and again, and again... without an end.所以你会一次又一次地叫自己(递归),一次又一次......没有结束。 This, in turn, means that the memory assigned to the stack will be exhausted at some point (because each frame takes some space) and it will cause a stack overflow .反过来,这意味着分配给堆栈的内存将在某个时候耗尽(因为每个帧都占用一些空间)并且会导致堆栈溢出。
Instead, you have to do something with the fraction
argument a
, most likely refer to an
and ad
.相反,您必须对fraction
参数a
做一些事情,最有可能引用an
和ad
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.