我只是想知道为什么这段代码不正确?它经常调用Foo构造函数,并在一段时间后导致堆栈溢出。
#include <iostream>
using namespace std;
class Foo
{
std::string str;
public:
Foo(const string& s) : str(s)
{
cout << "Foo constructor" << endl;
}
friend ostream& operator<<(ostream& os,const Foo& foo);
};
ostream& operator<<(ostream& os,const Foo& foo)
{
os << foo.str;
return os;
}
int main()
{
Foo foo{"Hello"};
cout << foo;
cin.get();
}
我知道,我知道写
是可以的 cout << foo.str << endl;
或os << foo.str.c_str();
但我想知道为什么会发生这种错误..
答案 0 :(得分:3)
该程序使用std::string
及其输出运算符,但不包含标题<string>
:使用<string>
时,您需要包含该标题。似乎通过包含std::string
来定义<iostream>
这一事实是不够的。它也不可移植:不同的实现可能只选择声明但未定义std::string
(需要声明,因为一些IOStream成员使用类型std::string
)。
如果找不到std::string
的输出运算符,则表达式
out << foo.str
被解释为
out << Foo(foo.str)
因为是 Foo
的输出运算符。当然,这确实会导致无限递归。