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

私はG ++ 4.6.1使用してこのコードをコンパイルしよう:C++のオーバーロード>>演算子奇妙なコンパイルエラー

「main.cppに:20:ERROR:「のstd ::はistream &電話帳::演算子を>>(std :: istream &、電話帳&)「正確に1つの引数を取る必要があります」

PS:それはかなり愚かなことでした。ありがとう、結構です。

答えて

5

の実装からphonebook::を削除する必要がありますoperator >>をメンバー関数としてストリーミングにオーバーロードすることはできません。メンバー関数として定義されている演算子は、その最初の引数を(const)Typeへの参照として受け取ります。ここで、Typeはクラス名です(この場合は電話帳です)。

あなたは、クラス内の友人を機能宣言するとき、あなたはクラスの内部でそれを定義するか、またはそれ以外のメンバ関数にするのいずれか

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

friend機能はメンバーではありません。それは、>>オペレータの左側がphonebookとなることを期待しています。これに(クラス外)関数定義の最初の行を変更します。それはメンバーではないので

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

注一切phonebook::はありません。

1

phonebookというメソッドを持っていないopeartor>>

あなたはphonebookの友人であるグローバル機能が存在することを述べ、そのため、あなたはoperator>>

0

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

を変更する必要があります。

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

ますので、このオペレータは>>電話帳のメンバ関数ではありません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; 
} 
関連する問題