【问题标题】:how getline works in this codegetline 在此代码中的工作原理
【发布时间】:2016-11-16 17:38:36
【问题描述】:
    int function1(string data){
        stringstream ss(data);
        return function2(ss);
    }
    int function2(stringstream& ss){
        string val;
        getline(ss,val,',');
        return stoi(val);
    }

如果我将 function2 更改为

    int function2(stringstream ss){...}

它不起作用。我想知道为什么? 编译错误是

使用已删除的函数 'std::basic_stringstream<_chart _traits _alloc>::basic_stringstream(const std::basic_stringstream<_chart _traits _alloc>&) [with _CharT = char; _Traits = std::char_traits; _Alloc = std::allocator]'

另一个问题是我很好奇 getline 的实际工作原理。就像下面的代码:

    while(!getline(ss,val,','))
        cout<<val;

getline 如何在一次迭代后跟踪迭代器的位置?

【问题讨论】:

  • 解释“不起作用”?您遇到编译器错误还是运行时错误?
  • getline() 不对 中的位置负责(提示)。
  • @DavidThomas 你能解释更多吗?我真的不知道
  • 你说当你把function2改成stringstream ss,就不行了。究竟是什么告诉你它不起作用?代码是否编译?或者当你运行你的程序时它会失败?
  • 所以编译器告诉你“你不能那样做!”。您正在尝试调用已删除的复制构造函数。 stringstream 的设计者不允许复制字符串流(仅移动)。在更改之前,我们传递了对字符串流的引用 - 这不需要复制操作。

标签: c++11 getline


【解决方案1】:

由于您尝试复制ss流并且使用(相对)新的C++语法删除了复制方法,因此发生错误。

你不允许复制流,所以你想把它给一个函数,你必须使用引用。

你可以找到一些关于

【讨论】:

    【解决方案2】:

    定义int function2(stringstream ss) 需要在stringstream 上使用已删除的复制构造函数。 stringstream 已删除复制构造函数和复制赋值运算符。 streamstream 允许移动。

    getline() 不跟踪流。 stringstream 的类定义派生自负责此细节/细节的 streambuf

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2018-05-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2016-12-25
      • 1970-01-01
      • 2021-09-07
      相关资源
      最近更新 更多