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 には 2 つのオーバーロードがあります。

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

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

はい、私はそれが言うことを知っていますbasic_streambufが、実際には単なる typedeftypedef basic_streambuf<char> streambuf;であるため、動作するはずです。なぜ機能しないのですか?

4

2 に答える 2

7

そのオーバーロードからstd::ostringstream継承しても、という名前の独自のメンバー関数も定義されているため、探しているオーバーロードを効果的に隠しているため、アクセスできません。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ですか?

通常は a をrdbuf返しますが、astd::basic_streambuf*std::ostringstream使用しstd::basic_stringbufます。

return-type に基づいてオーバーロードすることはできないため、以前のオーバーロードを効果的に隠して新しいオーバーロードを優先する決定が行われました。

を返すことで、 が内部でstringbufを使用しているstd::basic_stringbufことを簡単に確認できます。また、 ( に存在しない関数) の関数へのアクセスも容易になります。std::ostringstreamstrstd::basic_stringbufstd::basic_streambuf

于 2014-03-07T07:30:32.013 に答える