Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;_C++_Gcc_Istringstream - Fatal编程技术网

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++使它们可以移动,所以限制不再适用。(在这种情况下,这是一件好事。)