左操作数的类型为'std :: stringstream(__ cdecl *)(std :: string)'

时间:2013-11-26 03:28:03

标签: c++ stringstream

两个代码中的差异是什么:

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

}

我认为他们做同样的事情:都使用string来构造一个stringstream对象。无论临时对象还是真实对象,我们都会在stringstream中调用字符串复制构造函数(只需复制buf内容)

IDE:vs2010

那么,这两种方式有什么不同?或stringstream实现方式。

感谢。

1 个答案:

答案 0 :(得分:0)

克里斯放弃了答案。代码相当于以下内容:

stringstream in(string buf);

在C ++中,人们称之为the most vexing parse

编译器将其视为函数声明。 in是一个返回字符串流并接受string作为参数的函数。请注意,您的编译器会在错误消息std::stringstream (__cdecl *)(std::string)中告诉您。

您需要一组额外的括号或C ++ 11统一初始化器语法来告诉编译器它不是您声明的函数:

stringstream in((string(buf)));

stringstream in{string(buf)};