2

我有一个以 null 结尾的字符串存储在stypechar*中。我想istringstreams. 由于 的构造函数istringstream需要一个类型的参数string,我需要从s转换char*string。我通过以下方式使用其构造函数创建一个匿名string对象来做到这一点:s

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>>'

这对我来说似乎很奇怪,因为我不明白类型std::istringstream(std::string*)是什么。不strin应该是 typestd::istringstream吗?

通过使用以下代码的修改版本之一,我可以让编译器满意。

解决方案1:传递一个命名string对象

string str(s);
istringstream strin(str);

解决方案2:直接 pass s,好像会被隐式转换为string

istringstream strin(s);

解决方案3:显式转换sstring

istringstream strin((string)(s));

解决方案4:添加一对神奇的括号

istringstream strin((string(s)));

解决方案5:告诉编译器s确实是一个char*类型

istringstream strin(string((char*)s));

除了原始的,所有这些都有效。有人可以解释这里到底发生了什么吗?谢谢。

4

2 回答 2

4

最令人头疼的解析再次来袭:

std::istringstream strin( string( s ) );

声明一个函数 ( strin),它接受 astring作为参数,并返回一个std::istringstream. (一个好的编译器会在这里发出警告,因为你不可能实现这样的函数。)纠正这个问题的最简单方法是添加一些额外的括号:

std::stringstream strin( (string( s )) );

(实际上,这里最简单的解决方案就是写:

std::stringstream strin( s );

并让隐式转换完成这项工作。)

于 2013-08-12T08:31:38.567 回答
1

这是“最令人头疼的解析”问题。

istringstream strin(string(s));

这不是一个strin变量声明,而是一个函数的声明,它接受string并返回istringstream名为的函数strin

您可以像这样修复这种情况。注意+那里。Whiles是标识符,+s是表达式。

istringstream strin(string(+s));
于 2013-08-12T08:35:18.440 回答