C++ 重载 >> 运算符出现奇怪的编译错误

3
#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: error: ‘std::istream& phonebook::operator>>(std::istream&, phonebook&)’必须只接受一个参数"

PS:这是一个相当愚蠢的问题...显而易见:S。不过还是谢谢你。

5个回答

5
作为成员函数,您无法重载输入输出运算符(operator >>)。任何被定义为成员函数的运算符都需要将其第一个参数作为对(const)Type的引用,其中Type是您的类名 - 在这种情况下是电话簿(phonebook)。
您需要进行更改。
istream &phonebook::operator>>(istream &in, phonebook &book)

to

istream & operator>>(istream &in, phonebook &book)

3

friend 函数不是类的成员。它期望左侧的 >> 运算符为一个 phonebook。将函数定义的第一行(在类外)改为:

istream &operator>>(istream &in, phonebook &book)

请注意,没有phonebook::,因为它不是成员。

1

因为你声明了 friend istream &operator>>(istream &in, phonebook &book);

所以这个 operator>> 不是 phonebook 的成员函数。

C++ 03 标准的引用

11.4 Friends 类的友元是一个函数或类,它不是该类的成员,但允许使用该类的私有和受保护的成员名称。友元的名称不在类的作用域内,并且除非它是另一个类的成员,否则不会使用成员访问运算符(5.2.5)调用友元。

因此,删除 phonebook:: 就可以工作:

istream& operator>>(istream &in, phonebook &book)
{
    in >> book.name >> book.prefix;
    return in;
}

1

phonebook没有一个叫做opeartor>>的方法。

您说存在一个是phonebook的友元的全局函数,因此,在实现operator>>时应将phonebook::移除。


0
当您在类内声明函数为友元时,您可以将其定义在类内部或将其作为非成员函数。
istream & operator>>(istream &in, phonebook &book)
{
    in >> book.name >> book.prefix;
    return in;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接