是否可以更改ostringstream rdbuf?

时间:2014-03-07 06:35:42

标签: c++ streambuf ostringstream

我尝试以下代码:

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;,所以它应该有效。为什么不起作用?

2 个答案:

答案 0 :(得分:4)

即使std::ostringstreamrdbuf继承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)

因为在类ostringstreambasic_ostringstream<char>的typedef)中,只有rdbuf()的gettor版本被定义为其成员函数,所以从基类继承的settor版本是墙根即可。您可以使用rdbuf()的settor版本将oss向上转发到基类,例如ostream