为什么不运营商<<工作顺利吗?

时间:2017-09-13 06:58:40

标签: c++ gcc compiler-errors ostream

在编译以下代码时,我收到错误:

Expression.h

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

Expression.c

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

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

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

错误:&#39;运营商&lt;&lt;&lt;&# (操作数类型是&#39; std :: basic_ostream&lt; char&gt;&#39;和&#39; std :: ostream {aka std :: basic_ostream&lt; char&gt;}&#39;)

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

虽然给像Os(std::cout)之类的参数赋予初始值,但它是什么意思?

2 个答案:

答案 0 :(得分:2)

考虑

    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);

问题是标有&#34; Here&#34;的行。您正在向自己传输ostream。这是荒谬的。你想做什么?

如果您尝试输出流的标识符,则应使用地址:

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

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

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

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

答案 1 :(得分:1)

错误是因为没有标准operator<<ostream写入另一个ostream

此外,ostream无法从其他ostream进行复制构建,因此,如果您要为ostream指定输出Expression来写入,那么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;
}