2012-03-08 22 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