我的标题中有运算符:
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;
}
}
答案 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对象。