#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&amp; phonebook :: operator&gt;&gt;(std :: istream&amp;,phonebook&amp;)'必须只接受一个参数”
PS:问:这是非常愚蠢的事情......很明显:S。谢谢你。答案 0 :(得分:5)
您不能将operator >>
重载为成员函数。任何被定义为成员函数的运算符都将其第一个参数作为对(const)Type的引用,其中Type是您的类名 - 在本例中是电话簿。
您需要更改
istream &phonebook::operator>>(istream &in, phonebook &book)
到
istream & operator>>(istream &in, phonebook &book)
答案 1 :(得分:3)
friend
函数不是成员。实际上,它期望>>
运算符的左侧是phonebook
。将函数定义的第一行(类外)更改为:
istream &operator>>(istream &in, phonebook &book)
请注意,没有phonebook::
,因为它不是会员。
答案 2 :(得分:1)
phonebook
没有名为opeartor>>
您声明存在全局函数,该函数是phonebook
的朋友,因此,您应该从phonebook::
的实现中删除operator>>
< / p>
答案 3 :(得分:1)
因为您声明了friend istream &operator>>(istream &in, phonebook &book);
所以这个运营商&gt;&gt;不是电话簿的成员函数。
引用C ++ 03标准
11.4朋友们 类的朋友是不类的成员的函数或类,但允许使用类中的私有和受保护的成员名称。朋友的名称不在类的范围内,并且除非成员是另一个类的成员,否则不会使用成员访问运算符(5.2.5)调用该朋友。所以删除phonebook::
会起作用:
istream& operator>>(istream &in, phonebook &book)
{
in >> book.name >> book.prefix;
return in;
}
答案 4 :(得分:0)
当你在类中声明一个朋友的函数时,你要么在类中定义它,要么使它成为非成员函数。
istream & operator>>(istream &in, phonebook &book)
{
in >> book.name >> book.prefix;
return in;
}