重载运算符&gt;&gt;:无法将'std :: basic_istream <char>'左值绑定到'std :: basic_istream <char>&amp;&amp;'</char> </char>

时间:2014-03-11 08:25:02

标签: c++ c++11

我的标题中有运算符:

friend std::istream& operator>> ( std::istream& is, StudentRecord& sr );

在我班上:

std::istream& operator>>(std::istream& is ,  StudentRecord& sr){
    is >> sr.name >>std::ws>> sr.surname>>std::ws>>sr.studentNumber>>std::ws;
    getline(is, sr.classRecord);
    return is;
}

但是,我收到以下错误:

std::basic_istream<char>’ lvalue to ‘std::basic_istream<char>&&

在数据库类中:

void Database::read(string f)
{

    studRcrds.clear();
    std::ifstream in(f.c_str());
    string studLine;
    while (!(in.eof()))
    {

        getline(in,studLine);
        std::istringstream sin(studLine);
        StudentRecord newStudent();
        sin >> newStudent;
    }
}

2 个答案:

答案 0 :(得分:9)

错误有点令人困惑,但这意味着没有operator>>可用于sin >> newStudent;

这是因为您已将newStudent声明为函数(请参阅most vexing parse)。错误的措辞是因为右边有任何接受Rvalue流的重载:

template<typename CharT, typename TraitsT, typename T>
basic_istream<CharT, TraitsT>&
operator>>(basic_istream<CharT, TraitsT>&& istr, T&&);

因为newStudent的函数类型没有匹配运算符,所以它试图调用那个不能将rvalue-reference绑定到sin的重载。

修复是为了避免最令人烦恼的解析:

StudentRecord newStudent;

或:

StudentRecord newStudent{};

或:

StudentRecord newStudent = newStudent();

或类似的。如果更改newStudent具有正确的类型,那么可以使用operator>>重载。

答案 1 :(得分:-2)

您也可以更改您的getline功能:

istream&amp; getline(std :: istream&amp; is,StudentRecord&amp; sr)

不使用newStudent对象。