【问题标题】:How to use std::istream correctly如何正确使用 std::istream
【发布时间】:2013-01-28 17:34:51
【问题描述】:

我想做以下事情:

// I want 'is' to be either opened file or stringstream ...
void ParseTokens(const std::istream &is, std::vector<TokenClass> &vToks)
{
    char ch;
    ...
    is >> ch;
    ...
}

编译器抱怨:

error: ambiguous overload for ‘operator>>’ in ‘is >> ch’

我需要做什么才能完成这项工作?

[编辑]
请注意:operator&gt;&gt; 提供 格式化 输出 - 它会丢失空白字符(制表符、换行符等)。要访问所有字符,您需要使用get()

【问题讨论】:

  • 输入操作修改流。你无法做到const
  • @chris:好的 - 修复了它 - 将您的评论作为答案,以便我接受它,谢谢(在这种情况下,错误消息没有帮助:()

标签: c++ istream


【解决方案1】:

由于is &gt;&gt; ch;is 中提取字符,它会修改流。因此,函数签名中不能是const,这可能会导致看似不相关的错误,因为没有完全匹配。更改函数以获取std::istream &amp;

【讨论】:

  • 我想这是因为流需要增加某种“下一个”指针
  • 好吧,当你想一想,cin &gt;&gt; i,输入缓冲区以576\n 开头,之后包含\n。它必须修改它才能做到这一点。
  • @chris 从技术上讲,输入缓冲区在流缓冲区中,而不是流本身。这种间接可以允许对 const istream 进行大多数操作(例外是设置错误,如文件结尾)。但是,数据流是 istream 的“逻辑”部分,因此逻辑 const 表示任何修改它的东西,或者你在其中的位置,都不应该是 const。
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 2013-01-12
  • 2013-08-10
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 2014-08-29
  • 2021-04-12
相关资源
最近更新 更多