所以我今天卡在一个简单的打印功能上,我真的不知道如何解决这个问题。基本上我想把我的字符串传递给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
答案 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()
。