【问题标题】:Different output format for cin/ofstreamcin/ofstream 的不同输出格式
【发布时间】:2016-08-09 15:52:57
【问题描述】:

简介及相关资料:

假设我有以下课程:

class Example
{
    int m_a;
    int m_b;
    public:
    // usual stuff, omitted for brevity
    friend ostream & operator<< (ostream & os, const Example &e)
    {
        return os << m_a << m_b;
    }
};

问题:

我想保留cin 的默认行为,但写入ofstream 时的格式如下:

m_a , m_b

我为解决这个问题所做的努力:

我已经尝试在这里搜索,但没有找到任何类似的问题。

我尝试过在线搜索,但仍然没有找到任何有用的信息。

我已经尝试添加

friend ofstream & operator<< (ofstream & ofs, const Example &e)
{ 
    return ofs << m_a << ',' << m_b;
} 

进入类,但这会产生编译器错误。老实说,这种方法感觉不对,但在来这里寻求帮助之前我不得不尝试一下。

【问题讨论】:

  • "但这产生了编译器错误。" 错误是什么?
  • 我尝试复制添加特定友元函数的代码,它可以编译。
  • @FirstStep:很抱歉现在才回复,我刚下班回来。错误信息是这样的:error C2440: 'return' : cannot convert from 'std::basic_ostream&lt;char,std::char_traits&lt;char&gt;&gt;' to 'std::ofstream &amp;' 但我不知道那是什么意思。我在谷歌搜索时输入这个......

标签: c++ ifstream ofstream c++98


【解决方案1】:

链接运算符时,所有标准 &lt;&lt; 都将返回 ostream&amp; 引用。

那么您的return ... 将不起作用,因为该值与ofstream&amp; 返回类型不匹配。

只需在用户定义的operator&lt;&lt; 中使用ostream&amp;,它应该可以工作。

【讨论】:

  • 如您所说,我已将friend ofstream &amp; operator&lt;&lt; (ofstream &amp; ofs, const Example &amp;e) 更改为friend ostream &amp; operator&lt;&lt; (ofstream &amp; ofs, const Example &amp;e),并且成功了。我已经投票并正式接受。太感谢了!问候。
【解决方案2】:

字符串的语法是"S",即使它是一个字符字符串。 fstream 接受一个字符串而不是一个字符。因此,这应该有效:

friend ofstream & operator<< (ofstream & ofs, const Example &e) 
{ 
    ofs << e.m_a << "," << e.m_b; // " instead of '
    return ofs;
} 

【讨论】:

  • 我试过了,还是失败了。关键是按照用户 Bo Perrson 的建议将返回类型从 ofstream 更改为 ostream。然后一切正常。感谢您的帮助,我很感激。
  • 没关系。很高兴我们能提供帮助:)
【解决方案3】:

我最初以为您只是忘记了实现中的对象 e。

friend ostream & operator<< (ofstream & ofs, const Example &e)
{ 
   return ((ostream&) ofs) << e.m_a << ',' << e.m_b;
}

在一个类中带有 2 个参数的朋友二元运算符具有以下解释,本质上是在类主体中声明的外部方法。

但是在使用 clang++ 编译后,ofstream

其实ofstream

因此,您应该注意可能会产生未来编译错误的重载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2019-05-01
    • 2014-12-06
    • 1970-01-01
    相关资源
    最近更新 更多