gpt4 book ai didi

c++ - 使用临时字符串构建 istringstream

转载 作者:搜寻专家 更新时间:2023-10-31 00:44:02 26 4
gpt4 key购买 nike

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

#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 风格)。

编辑:由于 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com