6

我尝试以下代码:

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 有两个重载:

获取 (1) basic_streambuf<char_type,traits_type>* rdbuf() const;

设置 (2) basic_streambuf<char_type,traits_type>* rdbuf (basic_streambuf<char_type,traits_type>* sb);

是的,我知道它说basic_streambuf但它实际上只是一个 typedef typedef basic_streambuf<char> streambuf;,所以它应该可以工作。为什么它不起作用?

4

2 回答 2

7

即使从该重载std::ostringstream继承将无法访问,因为它还定义了自己的成员函数 named ,有效地隐藏了您正在寻找的重载。rdbufstd::basic_iosstd::basic_ostreamrdbuf

您可以通过将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返回 astd::basic_streambuf*std::ostringstream使用 a std::basic_stringbuf

由于不能基于返回类型重载,因此决定有效地隐藏以前的重载以支持新的重载。

通过返回 astd::basic_stringbuf可以很容易地看出它在内部std::ostringstream使用了stringbuf,并且它还提供了对( 中不存在的函数 ) 的str函数的更轻松访问。std::basic_stringbufstd::basic_streambuf

于 2014-03-07T07:30:32.013 回答
0

因为在类ostringstream(typedef of basic_ostringstream<char>)中,只有gettor版本rdbuf()被定义为它的成员函数,所以继承自基类的settor版本被隐藏rdbuf()您可以通过向上转换到基类来使用 settor 版本,oss例如ostream.

于 2014-03-07T07:24:59.447 回答