getline如何在此代码中工作

时间:2016-07-13 23:45:56

标签: c++11 getline

    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){...}

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

使用已删除的函数&#st; :: 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在一次迭代后如何跟踪迭代器的位置?

2 个答案:

答案 0 :(得分:2)

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

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

您可以找到有关

的一些信息

答案 1 :(得分:1)

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

getline()不会跟踪流。 stringstream的类定义来自streambuf,它负责这个细节/细节。