将std :: ostringstream作为函数参数的麻烦

时间:2014-06-19 20:09:14

标签: c++ visual-c++ stringstream

所以我今天卡在一个简单的打印功能上,我真的不知道如何解决这个问题。基本上我想把我的字符串传递给std :: cout-style的函数,如下所示:

foo(std::ostringstream() << "Hello" << " World!");

根据我的阅读,它应该可以通过

的功能实现
void foo(std::ostringstream& in)

但是在实施时我得到了一个有点奇怪的行为:

#include <iostream>
#include <sstream>

void foo(std::ostringstream& in)
{
    std::cout << in.str();
}

int main()
{
    std::ostringstream working;
    working << "Hello" << " World!";
    foo(working);                   // OK
    std::ostringstream notWorking;
    notWorking << "Hello";
    foo(notWorking<<" World!");     // Not OK?!
    return 0;
}

虽然第一次调用foo看起来很好并且工作得像预期的那样,但第二次调用仍然拒绝编译,即使它们(从我的角度来看)在技术上也应该是同样的东西。

错误:

error C2664: 'void foo(std::ostringstream &)': cannot convert parameter 1 from 'std::basic_ostream<char,std::char_traits<char>>' to 'std::ostringstream &'

我在Win7 x64上使用MS Visual Studio 2013 Express

3 个答案:

答案 0 :(得分:4)

IO操作的移位操作符的重载通过引用获取基本流。那就是:

std::ostream& operator<<( std::ostream& os , foo myfo )
{
    os << myfoo;

    return os;
}

因此,请使用std::ostream代替std::ostringstream作为函数参数:

void f( std::ostream& stream );

答案 1 :(得分:2)

这只是因为第二个表达

notWorking<<" World!"

返回std::ostream&而不是std::ostringsream&

答案 2 :(得分:0)

您输入错误的原因是您试图隐含地将ostream转发为ostringstream,因为<<运算符的结果始终为ostream&,而不管具体的字符串类型。更改foo()以获取ostream&应该解决此问题,除非您需要专门依赖ostringstream的实施foo功能,在这种情况下您可以{{1} }}

此外,通过在dynamic_cast示例中构建临时ostringstream,您将获得一个右值。 foo(std::ostringstream() << "Hello" << " World!");期望对流进行左值引用。您可以更改foo()以获取右值参考:foo()

相关问题