我有以下代码:
class Student {
public:
Student(){}
void display() const{}
friend istream& operator>>(istream& is, Student& s){return is;}
friend ostream& operator<<(ostream& os, const Student& s){return os; }
};
int main()
{
Student st;
cin >> st;
cout << st;
getch();
return 0;
}
我在省略friend
关键字以使运算符成为Student类的成员函数时尝试了自己,然后编译器将生成“binary 'operator >>' has too many parameters
”。我已经阅读了一些文档,说发生这种情况是因为所有成员函数总是收到一个隐含参数“this”(这就是为什么所有成员函数都可以访问私有变量)。
根据这个解释,我尝试了如下:
class Student {
public:
Student(){}
void display() const{}
istream& operator>>(istream& is){return is;}
ostream& operator<<(ostream& os){return os; }
};
int main()
{
Student st;
cin >> st;
cout << st;
getch();
return 0;
}
收到错误消息:“error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'Student' (or there is no acceptable conversion)
”
有人能给我一个明确的解释吗?
答案 0 :(得分:0)
我忘记了定义运算符的位置,但它可能是全局运算符&gt;&gt;,也可能是属于流的运算符。
在学生中定义它是错误的地方。
答案 1 :(得分:0)
你不能说这个函数是友元函数,然后在线包含函数。 friend关键字表示该函数未在类中定义,但它可以访问该类的所有私有和受保护变量。将您的代码更改为:
class Student {
public:
Student(){}
void display() const{}
friend istream& operator>>(istream& is, Student& s);
friend ostream& operator<<(ostream& os, const Student& s);
};
istream& operator >>(istream& is, Student& s) { return is; }
ostream& operator <<(ostream& os, const Student& s) { return os; }
再看http://www.java2s.com/Code/Cpp/Overload/Overloadstreamoperator.htm另一个例子。
使用&lt;&lt;和&gt;&gt;,左手操作数总是一个文件流,所以你不能在实际的类中重载它们(技术上必须进入文件流类)。