为什么这个带有ostream的用法字符串导致stackoverflow?

时间:2015-12-08 09:31:25

标签: c++ visual-c++ stack-overflow ostream

我只是想知道为什么这段代码不正确?它经常调用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();

但我想知道为什么会发生这种错误..

1 个答案:

答案 0 :(得分:3)

该程序使用std::string及其输出运算符,但包含标题<string>:使用<string>时,您需要包含该标题。似乎通过包含std::string来定义<iostream>这一事实是不够的。它也不可移植:不同的实现可能只选择声明但未定义std::string(需要声明,因为一些IOStream成员使用类型std::string)。

如果找不到std::string的输出运算符,则表达式

out << foo.str

被解释为

out << Foo(foo.str)

因为 Foo的输出运算符。当然,这确实会导致无限递归。