2012-05-31 68 views

答えて

11

確かです。それはなぜでしょうか?このような関数の宣言例:

void my_func(std::ostringstream& ss); 
+0

私が逃したことをありがとう、それは幾分可能であることは分かっていたが、その効果を達成するためにどの宣言が使用されているのかわからなかった – rsk82

+2

'' ss << "test" << hex << 33'のタイプが'std :: stringstream&'ではなく 'std :: ostream&'であり、それは与えられた署名と一致しません。 –

+0

@James Kanzeもちろん正しいです。 –

7

絶対に!値渡しではなく、参照渡しを確認してください。

void my_func(ostream& stream) { 
    stream << "Hello!"; 
} 
1

はい、それはある、と

Function(expresion) 

式が最初に評価されるようになりますし、それの結果は、パラメータ

注意として渡されます:のostreamを返しOperator << for ostreams

3

my_funcは、次の行に沿って署名を持たなければなりません。

void my_func(std::ostream& s); 

です。そのタイプはss << "text" << hex << 33です。目標は、生成された文字列を抽出し ある場合は、のような何かをする必要がyou'ld:あなたが一時的なストリームを使用できないことにも

void 
my_func(std::ostream& s) 
{ 
    std::string data = dynamic_cast<std::ostringstream&>(s).str(); 
    // ... 
} 

注意を。

my_func(std::ostringstream() << "text" << hex << 33); 

は、法的なC++ではないため、(VC++を除いて)コンパイルされません。あなたは一時的に使用したい場合は

my_func(std::ostringstream().flush() << "text" << hex << 33); 

:あなたは ような何かを書くことができます。しかし、あまりユーザーフレンドリーではありません。

関連する問題