【问题标题】:overloading << operator with ostream is not working. Why?用 ostream 重载 << 运算符不起作用。为什么?
【发布时间】:2016-07-15 10:03:02
【问题描述】:

我有一个小代码 sn-p,它试图重载 std::cout 的“

#include<iostream>
using namespace std;

ostream& operator<<(ostream& out,const string& str)
{
    out << "overloading" << str << "done";
    return out;
}

int main()
{
    cout << "string123";
}

输出:string123。 似乎我的重载函数没有被调用。为什么?

【问题讨论】:

  • 可能是因为已经有 an overload of the output operator 需要std::string
  • @JoachimPileborg 更有可能是接受const char*
  • @JoachimPileborg 接受std::string 的重载在&lt;string&gt; 标头中定义,很明显,这里不包括。
  • main 的返回类型在哪里?
  • @AlgirdasPreidžius:没有什么可以阻止 &lt;iostream&gt; 包括 &lt;string&gt; 对 OP 的实施。

标签: c++


【解决方案1】:

你基本上是在你的例子中射击自己。您为std::string 类型重载了operator&lt;&lt;,因此您应该期望每次尝试向out 发送“std::string”时都会调用它,从而导致运行时堆栈溢出。为了让它发挥作用,你:

  • 需要在operator&lt;&lt;重载时输出一个char *类型到out,这样才不会导致无限递归
  • main 中发送一个实际的std::string

这是一个没有运行时堆栈溢出问题的工作示例:

#include<iostream>
using namespace std;
ostream& operator<<(ostream& out, const string& str)
{
    out << "overloading" << str.c_str() << "done";
    return out;
}

int main()
{
    cout << std::string("string123");
}

输出是

overloadingstring123done

【讨论】:

  • @user2531608 upvote 和 answer接受是 stackoverflow 表示感谢的方式:)
【解决方案2】:

首先,您播放的不是std::string,而是const char*。你可以改写cout &lt;&lt; std::string("string123") 来解决这个问题(demo;不过,ew)。

请注意,&lt;string&gt; 中已经存在这样的重载,并且您的实现显然恰好包含 &lt;string&gt;&lt;iostream&gt;as does mine,这是它的特权)。但是,您的版本(在进行上述修复后)更匹配,因为不需要调用 ADL 即可找到它。

【讨论】:

    【解决方案3】:

    你应该发送一个字符串类型到&lt;&lt;:

    ostream& operator<<(ostream& out,const string& str)
    {
        out<<"overloading";
        return out;
    }
    
    int main()
    {
        string s = "string123";
        cout << s;
    }
    

    请注意,在&lt;&lt; 定义中再次发送字符串本身将使

    out << "overloading" << str <<"done"
    

    【讨论】:

    • 它确实输出“overloading”字符串,但不输出“string123”
    • @buld0zzr 没错。所以? OP 问题是关于重载,而不是如何做一些打印示例。
    • 根据cplusplus.com/reference/ostream/ostream/operator%3C%3C,您的实现不是ostream&lt;&lt; 操作员的预期行为
    • @buld0zzr 你在开玩笑吗?这不是问题。这里没有一般ostream&lt;&lt;的“预期行为”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-12
    • 1970-01-01
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多