我尝试以下代码:
ostringstream oss;
streambuf *psbuf, *backup;
backup = oss.rdbuf();
psbuf = cout.rdbuf();
oss.rdbuf(psbuf);
oss << things << endl;
oss.rdbuf(backup);
但不幸的是我收到了这个错误:
error: too many arguments to function call, expected 0, have 1
oss.rdbuf(backup);
但是rdbuf有两个重载:
get(1)basic_streambuf&lt; char_type,traits_type&gt; * rdbuf()const;
set(2)basic_streambuf&lt; char_type,traits_type&gt; * rdbuf(basic_streambuf&lt; char_type,traits_type&gt; * sb);
是的,我知道它说的是basic_streambuf
,但它确实只是一个typedef typedef basic_streambuf<char> streambuf;
,所以它应该有效。为什么不起作用?
答案 0 :(得分:4)
即使std::ostringstream
从rdbuf
继承std::basic_ios
,由于std::basic_ostream
还定义了自己的名为{{1}的成员函数,因此无法访问重载,有效地隐藏了你正在寻找的重载。
您可以通过将rdbuf
实例转换为std::ostringstream
引用来访问成员函数,如下例所示:
std::ostream
std::ostringstream oss;
std::ostream& oss_ref = oss;
auto prev = oss_ref.rdbuf (std::cout.rdbuf ());
oss << "hello world"; // will print to the buffer of std::cout
oss_ref.rdbuf (prev); // reset
为什么static_cast<std::ostream&> (oss).rdbuf (...) // equivalent
定义了自己的std::basic_ostringstream
?
通常rdbuf
会返回rdbuf
,但std::basic_streambuf*
会使用std::ostringstream
。
由于基于返回类型不能重载,因此决定有效地隐藏前一个重载以支持新的重载。
通过返回std::basic_stringbuf
,很容易看到std::basic_stringbuf
在内部使用 stringbuf ,并且还可以更轻松地访问std::ostringstream
str
函数1}}(std::basic_stringbuf
中不存在的函数)。
答案 1 :(得分:0)
因为在类ostringstream
(basic_ostringstream<char>
的typedef)中,只有rdbuf()
的gettor版本被定义为其成员函数,所以从基类继承的settor版本是墙根即可。您可以使用rdbuf()
的settor版本将oss
向上转发到基类,例如ostream
。