2010-06-09 198 views
2

我有一個wstringstream:麻煩與wstringstream

wstringstream sstream; 
AlterSstream(sstream); 

wstringstream bar_stream; 

bar_stream << sstream; 
bar_stream << "foo"; 

MessageBoxW(
    NULL, 
    bar_stream.str().c_str(), 
    L"subject", 
    MB_OK 
); 

它輸出一串長長的,看起來沒有什麼像什麼,我把它AlterSstream()

00000000002CEC58foo 

AlterSstream:

void AlterSstream(wstringstream& outStream) 
{ 
    outStream << "odp"; 
} 

這是怎麼發生的?如果我直接打印出sstream,它工作正常,但打印出bar_stream會產生問題。我猜測<<運算符不能像我認爲的那樣在兩個流之間運行?

UPDATE:對不起,我原本留下了一些代碼。它固定在上面。

+0

您確定'AlterSstream'沒有將「00000000002CEC58」添加到流中嗎? – 2010-06-09 22:37:32

+0

什麼是'AlterSstream'? – GManNickG 2010-06-09 22:38:18

+0

@GMan和@RSK - 更新 – 2010-06-09 22:43:11

回答

3

沒有過載,以從流至流拷貝。 您需要更改行:

bar_stream << sstream; 

到:

bar_stream << sstream.str(); 
+0

Nitpick:no over * LOAD *。 – tpdi 2010-06-09 23:20:47

+0

你是完全正確的。固定。 – DiGMi 2010-06-09 23:36:57

1

你試過L"odp"

+0

嗯好主意,但沒有奏效 - 與以前一樣的問題。 – 2010-06-09 22:51:33

3

看起來編譯器選擇了operator<<的版本,它接受void*參數並以十六進制打印其64位地址。 operator<<的文本打印版本是一個模板,它採用與流表示相同類型的字符,在您的情況下爲wchar_t。你已經通過了一個char的數組;使用寬字符字面代替,如Swegi's answer表明:

outStream << L"odp"; 
+0

我在想同樣的事情,但爲什麼編譯器爲sstream <<「foo」選擇正確的重載?唯一的區別是op <<「odp」與Alterstream函數中的sstream引用一起調用。 – tpdi 2010-06-09 22:53:34

+0

在另一方面,如果編譯器內部使用'AlterSstream'的'無效*'版本,那麼就應該選擇了該版本將'foo'。我沒有解釋不同的行爲。你確定你將你的真實代碼複製並粘貼到你的問題中嗎? – 2010-06-09 22:55:05

+0

其實,我沒有完全正確地複製代碼。我已經糾正了OP。 – 2010-06-09 22:56:15

0

好吧,你更新你發現問題:

bar_stream < < sstream;

wstringstream是:

typedef basic_stringstream<wchar_t> wstringstream; 

basic_stringstream是-A basic_iostream,這是 - 一個basic_ostream(和basic_istream,但我們不關心那部分),這是-A basic_ios是-A的ios_base 。

但是沒有basic_ostream& operator<<(basic_ostream&);;我不確定編譯器正在使用哪個超載,但它從輸出中顯示爲basic_stringstream & basic_stringstream :: operator < <(void * p),它以十六進制輸出指針的值。

如果要複製sstream的數據,請使用帶有const basic_string的wstringstream ctor。傳遞一份原始wstringstream內部字符串的副本:

wstringstream bar_stream(sstream.str()) ;