首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用字符串temporary构建istringstream

使用字符串temporary构建istringstream
EN

Stack Overflow用户
提问于 2012-03-08 08:23:33
回答 1查看 1.9K关注 0票数 2

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

代码语言:javascript
复制
#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;

它失败了,错误如下:

代码语言:javascript
复制
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>>’

当以下代码编译并正常运行时:

代码语言:javascript
复制
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是一个类型定义函数,我怀疑模板最终会有什么问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-08 08:30:33

代码语言:javascript
复制
istringstream ss(string(s));

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

代码语言:javascript
复制
istringstream ss( (string(coin)) );

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

在本例中,您当然可以这样做:

代码语言:javascript
复制
istringstream ss(coin);

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

代码语言:javascript
复制
istringstream ss{string{coin}};

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9611230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档