C++11 getline在此代码中的工作原理

C++11 getline在此代码中的工作原理,c++11,getline,C++11,Getline,如果我将函数2更改为 int function1(string data){ stringstream ss(data); return function2(ss); } int function2(stringstream& ss){ string val; getline(ss,val,','); return stoi(val); } 它不起作用。我想知道为什么? 顺从

如果我将函数2更改为

    int function1(string data){
        stringstream ss(data);
        return function2(ss);
    }
    int function2(stringstream& ss){
        string val;
        getline(ss,val,',');
        return stoi(val);
    }
它不起作用。我想知道为什么? 顺从错误是

使用已删除的函数“std::basic\u stringstream::basic\u stringstream(const std::basic\u stringstream&)[带{u CharT=char;{u Traits=std::char\u Traits;{u Alloc=std::allocator]'

另一个问题是,我很好奇getline实际上是如何工作的。如下面的代码所示:

    int function2(stringstream ss){...}
while(!getline(ss,val,,'))

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


getline()
不跟踪流<代码> STRIGSWATE 的类定义源于代码> StUBFF ,负责此细节/细节。

< P>由于您试图复制<代码> SS<代码>流,复制和使用新的C++语法删除流和复制方法,因此出现错误。 您不允许复制流,所以若要将其提供给函数,必须使用引用

你可以找到一些关于

  • 删除的功能:
  • stringstream构造函数:

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