不匹配'operator<<'在'std :: operator<<

时间:2014-01-24 12:20:06

标签: c++ printing decimal cout zero

void printAst(int x)
{
    for( int i = 0; i < x; i++)
    {
        cout << "*";
    }
    cout << " (" << x << ")" << endl;
}

void printHisto(int histo[])
{
    //cout.precision(3);

    int count = 0;

    for(double i = -3.00; i < 3.00; i += 0.25)
    {
        cout << setprecision(3) << i << " to " << i + 0.25 << ": " << printAst(histo[count]) << endl;
        // cout << setw(3) << setfill('0') << i << " to " << i + 0.25 << ": " << histo[count] << endl;
        count ++;
    }
}

我希望我的输出格式如下,所以我使用了setprecision(3),这也不起作用。

-3.00至-2.75:(0)
-2.75到-2.50:*(1)
-2.50至-2.25:*(1)
-2.25到-2.00: * (6)
-2.00至-1.75:
** * ** (12)

所以它的格式是这样的

-3到-2.75:3
-2.75到-2.5:4
-2.5到-2.25:5
-2.25到-2:0
-2到-1.75:0

然而,主要的问题是当我尝试将printAst调用到histo [count]时。这是导致此错误的原因。 PrintAst用于打印星号,histo [count]提供要打印的星号数量。

cout&lt;&lt; setprecision(3)&lt;&lt; i&lt;&lt; “to”&lt;&lt; i + 0.25&lt;&lt; “:”&lt;&lt; printAst(histo [count])&lt;&lt; ENDL;

1 个答案:

答案 0 :(得分:0)

您似乎对链接<<如何在流中起作用存在误解。

cout << 42看起来像一个带有两个操作数的运算符表达式,但它实际上是对具有两个参数的函数的调用(函数的名称是operator<<)。此函数返回对流的引用,从而启用链接。

这样的表达式:

cout << 1 << 2;

相当于:

operator<<( operator<<(cout, 1), 2);

现在,问题是函数的参数不能是void,而是printAst返回的参数。相反,您需要返回可以流式传输的内容 - 换句话说,operator<<已经重载的内容。我建议std::string

std::string printAst(int x);
{
    std::string s = " (" + std::string(x,'*') + ")";
    return s;
}

您可以阅读有关operator overloading的更多信息。