【问题标题】:Why doesn`t operator<< work successfully?为什么 operator<< 不能成功工作?
【发布时间】:2017-09-13 06:58:40
【问题描述】:

在编译以下代码时,出现错误:

表达式.h

class Expression{
    ...
protected:
    std::ostream Os;
};

表达式.c

Expression::Expression() : Os(std::cout)
{
    ...
} 

Expression::Expression(std::ofstream &os) : Os(os)
{
    ...
}

Expression::Dump()
{
     Os << "=============================================================" << std::endl;
     Os << "Os:               " << Os << std::endl;
}

错误:'operator' 和 'std::ostream {aka std::basic_ostream}')

我的错误是什么?我该怎么做才能解决它?

同时给像Os(std::cout)这样的参数赋予初始值,这是什么意思?

【问题讨论】:

标签: c++ gcc compiler-errors ostream


【解决方案1】:

考虑

    Os << "Os:               " << Os << std::endl;

让我们解开它的全部功能:

std::ostream& t1 = Os.operator <<("Os:               ");
std::ostream& t2 = t1.operator <<(Os);                   // << Here
std::ostream& t3 = t2.operator <<(std::endl);

问题是标有“这里”的行。您正在向自身流式传输 ostream。这是荒谬的。你想做什么?

如果你想为流输出一个标识符,你应该使用地址:

    Os << "Os:               " << &Os << std::endl;

如果你想将流的内容输出到stdout,你需要将Os设为ostringstream,然后输出字符串缓冲区:

    std::ostringstream Os;
    ...
    std::stdout << "Os:               " << Os.str() << std::endl;

学究式注意:我相信我将原始行分解为函数调用和初始化在这种特殊情况下实际上是相同的(因为没有临时对象 - 只有引用);一般来说,临时对象的生命周期可能略有不同。

【讨论】:

    【解决方案2】:

    错误是因为没有标准的operator&lt;&lt;ostream 写入另一个ostream

    另外,ostream 不能从另一个 ostream 复制构造,因此如果您尝试为 Expression 指定输出 ostream 写入,则需要声明您的 Os 成员而是作为参考。

    class Expression {
        ...
    protected:
        std::ostream &Os;
    };
    

    Expression::Expression() : Os(std::cout)
    {
        ...
    }
    
    Expression::Expression(std::ofstream &os) : Os(os)
    {
        ...
    }
    
    Expression::Dump()
    {
        Os << "=============================================================" << std::endl;
        Os << "Os: " << SomethingThatIsNotOs << std::endl;
    }
    

    【讨论】:

    • 我不同意第二句话。如果你定义一些 std::ostream&amp; operator &lt;&lt; (std::ostream&amp;, std::ostream&amp;) - 这会很奇怪 - 不太可能进行无限递归
    猜你喜欢
    • 2018-02-24
    • 1970-01-01
    • 2021-04-10
    • 2014-05-27
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多