【问题标题】:Building an istringstream with a string temporary使用字符串临时构建 istringstream
【发布时间】:2012-03-25 13:21:21
【问题描述】:

在尝试我的代码回答另一个问题时,我发现以下代码无法编译

#include <iostream>
#include <cstring>
#include <sstream>
#include <string>

using namespace std;

// (main omitted)
const char * coin = "3D";
istringstream ss(string(s));
int i;
ss >> hex >> i;              <--- error here
cout << (char) i << endl;

失败并出现以下错误:

test.cpp:15:11: error: invalid operands of types ‘std::istringstream(std::string) {aka std::basic_istringstream<char>(std::basic_string<char>)}’ and ‘std::ios_base&(std::ios_base&)’ to binary ‘operator>>’

虽然以下编译和运行正常:

const char* coin = "3D";
string s(coin);
istringstream ss(s); // or directly istringstream ss("3D")
int i;
ss >> hex >> i;              
cout << (char) i << endl;

如果我查看istringstream 的构造函数的定义,它接受const std::string&amp;(实际上是basic_string&lt;char&gt; 等效项),然后编译。所以我猜模板参数推导有一种我不理解的行为并创建了一个不太符合istringstream,但为什么呢?

我使用的是 GCC 4.6.1(Ubuntu 风格)。

编辑:由于 istringstream 是 typedef,我怀疑模板最终是否有任何问题。

【问题讨论】:

  • 试试改成:istringstream ss((string(s)));

标签: c++ stl iostream


【解决方案1】:
istringstream ss(string(s));

您的编译器认为这是一个函数声明,该函数采用 string(名为 s)并返回 istringstream。将参数括在括号中以消除歧义。顺便问一下,s 是什么?你的意思是coin吗?

istringstream ss( (string(coin)) );

如果您感到困惑,请阅读this

在这种特殊情况下,您当然可以这样做:

istringstream ss(coin);

如果你的编译器支持它,你也可以使用统一的初始化语法来避免 MVP:

istringstream ss{string{coin}};

这对大多数人来说可能有点奇怪,我知道这对我来说很奇怪,但这只是因为我已经习惯了旧语法。

【讨论】:

  • 谢谢,它成功了。我被最令人烦恼的解析击中了。第一次很痛;)。我现在更好地理解了为什么错误消息中的类型看起来很奇怪。
  • Your compiler thinks that's a declaration of a function taking a string (named s) and returning an istringstream 没错
  • 他本可以说得很好istringstream ss(coin);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-05
  • 2013-11-26
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
相关资源
最近更新 更多