[英]C++ overloading >> operator strange compile error
#include <iostream>
#include <string>
using namespace std;
class phonebook
{
string name;
string prefix;
public:
phonebook(string &name, string &prefix)
{
this->name = name;
this->prefix = prefix;
}
friend istream &operator>>(istream &in, phonebook &book);
};
istream &phonebook::operator>>(istream &in, phonebook &book)
{
in >> book.name >> book.prefix;
return in;
}
int main()
{
return 0;
}
当我尝试使用g ++ 4.6.1编译此代码时:
“main.cpp:20:错误:'std :: istream&phonebook :: operator >>(std :: istream&,phonebook&)'必须只接受一个参数”
PS:这是非常愚蠢的事情......很明显:S。 谢谢你。
您不能重载operator >>
for streaming作为成员函数。 任何被定义为成员函数的运算符都将其第一个参数作为对(const)Type的引用,其中Type是您的类名 - 在本例中为phonebook。
你需要改变
istream &phonebook::operator>>(istream &in, phonebook &book)
至
istream & operator>>(istream &in, phonebook &book)
friend
功能不是会员。 实际上,它期望>>
运算符的左侧是phonebook
。 将函数定义的第一行(类外)更改为:
istream &operator>>(istream &in, phonebook &book)
请注意,没有phonebook::
因为它不是会员。
phonebook
没有一个叫做opeartor>>
的方法
您声明存在一个全局函数,它是phonebook
的朋友,因此,您应该从operator>>
的实现中删除phonebook::
因为你宣布了friend istream &operator>>(istream &in, phonebook &book);
所以这个运营商>>不是电话簿的成员功能。
从C ++ 03标准引用
11.4朋友类的朋友是一个函数或类,它不是类的成员,但允许使用类中的私有和受保护的成员名。 朋友的名称不在类的范围内,并且除非成员是另一个类的成员,否则不会使用成员访问运算符(5.2.5)调用该朋友。
所以删除phonebook::
会工作:
istream& operator>>(istream &in, phonebook &book)
{
in >> book.name >> book.prefix;
return in;
}
当你在类中声明一个朋友的函数时,你要么在类中定义它,要么使它成为非成员函数。
istream & operator>>(istream &in, phonebook &book)
{
in >> book.name >> book.prefix;
return in;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.