C++ 在C++;
我在C++ 在C++;,c++,gcc,istringstream,C++,Gcc,Istringstream,我在s中存储了一个以null结尾的字符串,类型为char*。我想从s创建一个istringstream对象。由于istringstream的构造函数需要string类型的参数,因此我需要将s从char*转换为string。我通过以下方式使用构造函数从s创建一个匿名string对象来实现这一点: istringstream strin(string(s)); 当使用gcc(4.7.3)编译时,这看起来还可以。但是,在我添加以下代码以使用strin int r; strin >> r;
s
中存储了一个以null结尾的字符串,类型为char*
。我想从s
创建一个istringstream
对象。由于istringstream
的构造函数需要string
类型的参数,因此我需要将s
从char*
转换为string
。我通过以下方式使用构造函数从s
创建一个匿名string
对象来实现这一点:
istringstream strin(string(s));
当使用gcc(4.7.3)编译时,这看起来还可以。但是,在我添加以下代码以使用strin
int r;
strin >> r;
我得到了编译错误:
error: invalid operands of types 'std::istringstream(std::string*) {aka std::basic_istringstream<char>(std::basic_string<char>*)}' and 'int' to binary 'operator>>'
解决方案2:直接传递s
,似乎它将被隐式转换为string
istringstream strin(s);
istringstream strin((string)(s));
解决方案3:显式地将s
转换为string
istringstream strin(s);
istringstream strin((string)(s));
解决方案4:添加一对神奇的括号
istringstream strin((string(s)));
解决方案5:告诉编译器s
确实是char*
类型
istringstream strin(string((char*)s));
除了原作,所有这些作品都很好。谁能解释一下这里到底发生了什么?谢谢。最烦人的解析再次出现:
std::istringstream strin( string( s ) );
声明一个函数(strin
),该函数以string
作为参数,并返回一个std::istringstream
。(一个好的编译器可能会在这里发出警告,因为您无法实现这样的函数。)纠正这一问题的最简单方法是添加一些额外的括号:
std::stringstream strin( (string( s )) );
(实际上,这里最简单的解决方案就是写:
std::stringstream strin( s );
让隐式转换来完成这项工作。)这是“最麻烦的解析”问题
这不是一个strin
变量声明,而是一个函数的声明,该函数采用string
,返回名为strin
的istringstream
你可以这样修理这个箱子。注意这里的+
。s
是标识符,+s
是表达式
istringstream strin(string(+s));
搜索:最烦人的解析。。阅读所有关于它的内容……),顺便说一句,我更喜欢解决方案2…为什么不可能实现这个功能?我认为流现在是可移动的。或者,如果转换必须是显式的,请使用C++11统一初始化:
std::stringstream strin{string{s}代码>“一个好的编译器可能会在这里发出警告,因为您无法实现这样的函数”。为什么这样的功能不能实现?是因为流类是不可复制的吗?还是?@jrok啊,今天是的。但除非您使用的是C++11(实际上,大多数人可能无法做到)。@Nawaz是的。当然,C++使它们可以移动,所以限制不再适用。(在这种情况下,这是一件好事。)