2013-11-26 78 views
0

什麼兩碼的差異吹:左操作數的類型 '的std :: stringstream的(__cdecl *)(的std :: string)'

char buf[2048]; 
stringstream in(string(buf)); 
int tmpInt; 

while ((in >> tmpInt)) { // wrong, error C2296: '>>' : illegal, left operand has type 'std::stringstream (__cdecl *)(std::string)' 

} 

char buf[2048]; 
string tmpStr(buf); 
stringstream in(tmpStr); 

while ((in >> tmpInt)) { // right 

} 

我覺得他們做的同樣的事情:都使用字符串來構造一個stringstream對象。無論臨時對象或一個真正的對象,我們將調用stringstream的字符串拷貝構造函數(只複製BUF內容)

IDE:vs2010

那麼,究竟這兩種方式有什麼不同?或者stringstream實現方式。

謝謝。

+0

這是最讓人頭疼的解析。 – chris

回答

0

Chris給出了答案。該代碼等效於以下內容:

stringstream in(string buf); 

在C++中,人們將此稱爲the most vexing parse

編譯器將其視爲函數聲明。 in是一個函數,它返回一個stringstream並接受一個string作爲參數。請注意,您的編譯器在錯誤消息std::stringstream (__cdecl *)(std::string)中告訴你這一點。

您將需要一個額外的括號或C++ 11統一初始化語法告訴編譯器,它不是一個功能,您聲明:

stringstream in((string(buf))); 

stringstream in{string(buf)}; 
+0

哦,我明白了。編譯認爲這是一個函數向前聲明。謝謝Jesse。 –

相關問題