C ++ перегрузка >> оператор странная ошибка компиляции - PullRequest
3 голосов
/ 14 сентября 2011
#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. Спасибо, хотя.

Ответы [ 5 ]

5 голосов
/ 14 сентября 2011

Вы не можете перегрузить operator >> для потоковой передачи как функции-члена.Любой оператор, который определен как функция-член, получает свой первый аргумент как ссылку на (const) Type, где Type - имя вашего класса - в данном случае, телефонная книга.

Вам необходимо изменить

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

до

istream & operator>>(istream &in, phonebook &book)
3 голосов
/ 14 сентября 2011

A friend функция не является членом.В сущности, он ожидает, что левая часть оператора >> будет phonebook.Измените первую строку определения функции (вне класса) следующим образом:

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

Обратите внимание, что phonebook:: нет, поскольку он не является членом.

1 голос
/ 14 сентября 2011

потому что вы объявили 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;
}
1 голос
/ 14 сентября 2011

phonebook не имеет метода с именем opeartor>>

Вы указали, что существует функция global , которая является другом phonebook, и поэтому вам следуетудалить phonebook:: из реализации operator>>

0 голосов
/ 14 сентября 2011

Когда вы объявляете функцию другом внутри класса, вы либо определяете ее внутри класса, либо делаете ее функцией, не являющейся членом.

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