C ++重载>> operator奇怪的编译错误

时间:2011-09-14 12:12:06

标签: c++ operator-overloading overloading

#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。谢谢你。

5 个答案:

答案 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;
}