今天我在一个简单的打印函数上遇到了问题,但我真的不知道该如何解决这个问题。基本上,我想把我的字符串传递给一个函数,并以std::cout的方式打印出来,就像这样:
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。
foo
真的需要一个ostringstream
,你应该使用你的可行方法,而不是修改函数以接受一个ostream
。如果你真的想要遵循你的其他方法,那么你可以将ostream
强制转换回ostringstream
(static_cast<std::ostringstream&>(in).str()
),但是如果有人使用其他类型的ostream
调用foo
,那么它就是未定义的行为。 - Praetorian