2011-09-14 5 views
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; 
} 

Lorsque je tente de compiler ce code en utilisant g ++ 4.6.1:C++ surcharge >> opérateur erreur de compilation étrange

« main.cpp: 20: Erreur: « std :: istream & répertoire opérateur :: >> (std :: istream &, répertoire &) 'doit prendre exactement un argument'

PS: C'était assez bête de demander ... Tellement évident: S. Merci quand même.

Répondre

5

Vous ne pouvez pas surcharger operator >> pour la diffusion en tant que fonction membre. Tout opérateur défini comme une fonction membre prend son premier argument comme référence à Type (const), où Type est votre nom de classe - dans ce cas, répertoire.

Vous devez changer

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

à

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

Une fonction friend n'est pas un membre. Tel qu'il est, il s'attend à ce que le côté gauche de l'opérateur >> soit phonebook. Modifiez la première ligne de la définition de la fonction (en dehors de la classe) à ceci:

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

Notez qu'il n'y a pas phonebook:: parce que c'est pas membre.

1

phonebook n'a pas une méthode appelée opeartor>>

Vous dites qu'il existe une fonction globale qui est un ami de phonebook, et par conséquent, vous devez supprimer phonebook:: de la mise en œuvre de operator>>

0

Lorsque vous fonctionnez un ami déclariez dans la classe, soit vous définissez dans la classe ou en faire une fonction non-membre.

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

parce que vous avez déclaré friend istream &operator>>(istream &in, phonebook &book);

donc cet opérateur >> n'est pas une fonction de membre du répertoire.

Citation de C++ 03 standards

11,4 Amis Un ami d'une classe est une fonction ou une classe qui est pas un membre de la classe, mais est autorisée à utiliser les noms de membres privés et protégés de la classe. Le nom d'un ami n'est pas dans la portée de la classe, et l'ami n'est pas appelé avec les opérateurs d'accès de membre (5.2.5) à moins qu'il ne soit membre d'une autre classe.

enlever Ainsi, le phonebook:: travaillerait:

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