两个代码中的差异是什么:
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
感谢。
答案 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)};