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

#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&(实际上是等效basic_string<char>),然后进行编译。所以我猜想模板参数推导具有我不了解的行为,并创建了一个不太符合istringstream的行为,但是为什么呢?

我正在使用GCC 4.6.1(Ubuntu flavor )。

编辑:由于istringstream是一个typedef,我怀疑最后模板是否有问题。

最佳答案

istringstream ss(string(s));

您的编译器认为这是一个函数的声明,该函数采用string(名为s)并返回istringstream。为了避免歧义,请在括号中加上参数。顺便说一句,s是什么?您的意思是coin吗?
istringstream ss( (string(coin)) );

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

在这种情况下,您当然可以这样做:
istringstream ss(coin);

如果编译器支持,则还可以使用统一的初始化语法避免使用MVP:
istringstream ss{string{coin}};

对于大多数人来说,这可能看起来有些奇怪,我知道这对我来说似乎很奇怪,但这仅仅是因为我已经习惯了旧语法。

关于c++ - 使用临时字符串构建istringstream,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9611230/

10-11 23:07