2012-03-08 54 views
1

在嘗試我的代碼來回答另一個問題,我發現下面沒有編譯構建istringstream用繩子臨時

#include <iostream> 
#include <cstring> 
#include <sstream> 
#include <string> 

using namespace std; 

// (main omitted) 
const char * coin = "3D"; 
istringstream ss(string(s)); 
int i; 
ss >> hex >> i;    <--- error here 
cout << (char) i << endl; 

它失敗,出現以下錯誤:

test.cpp:15:11: error: invalid operands of types ‘std::istringstream(std::string) {aka std::basic_istringstream<char>(std::basic_string<char>)}’ and ‘std::ios_base&(std::ios_base&)’ to binary ‘operator>>’ 

雖然以下編譯並正常運行:

const char* coin = "3D"; 
string s(coin); 
istringstream ss(s); // or directly istringstream ss("3D") 
int i; 
ss >> hex >> i;    
cout << (char) i << endl; 

如果我看一下定義的它構造函數爲istringstream,它接受const std::string&(實際上相當於basic_string<char>),並編譯。所以我猜模板論證扣除有一個我不明白的行爲,並創建一個不那麼符合istringstream,但爲什麼?

我使用的是GCC 4.6.1(Ubuntu風格)。

編輯:由於istringstream是一個typedef,我懷疑最後模板有什麼問題。

+1

嘗試將其更改爲:istringstream ss((string(s))); – Ylisar 2012-03-08 00:32:16

回答

4
istringstream ss(string(s)); 

你的編譯器認爲這是採取了功能的string(命名爲s),並返回一個istringstream的聲明。將括號括在括號內以便消除歧義。順便說一下,s是什麼?你的意思是coin嗎?

istringstream ss((string(coin))); 

閱讀this如果你感到困惑。

在這種特殊情況下,你當然可以剛剛做這個:

istringstream ss(coin); 

如果你的編譯器支持的話,也可避免使用MVP統一初始化語法:

istringstream ss{string{coin}}; 

那對大多數人來說可能看起來有點奇怪,我知道這對我來說看起來很奇怪,但那是因爲我習慣了舊的語法。

+0

謝謝,它的工作。我被最令人煩惱的解析所擊中。這是第一次傷害;)。我現在明白爲什麼錯誤消息中的類型看起來很奇怪。 – 2012-03-08 00:36:16

+1

'你的編譯器認爲這是一個函數聲明,其中包含一個字符串(命名爲s)並返回一個istringstream'而且這是正確的 – 2012-03-08 00:38:17

+0

他可以很好地說'istringstream ss(coin);'。 – 2012-03-08 01:07:46