2013-11-26 45 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。 –

相关问题