2011-07-05 7 views
0

私は次のコードがありますC++のカスタムI/O演算子に関する質問?

class Student { 
public: 
    Student(){} 
    void display() const{} 
    friend istream& operator>>(istream& is, Student& s){return is;} 
    friend ostream& operator<<(ostream& os, const Student& s){return os; } 
}; 
int main() 
{ 
    Student st; 
    cin >> st; 
    cout << st; 

    getch(); 
    return 0; 
} 

をオペレーターがStudentクラスのメンバ関数となり、その後、コンパイラは「binary 'operator >>' has too many parameters」を生み出す作るためにfriendキーワードを省略したとき、私は自分自身を試してみました。私は、すべてのメンバ関数が常に暗黙のパラメータ "this"を受け取るため(すべてのメンバ関数がプライベート変数にアクセスできる理由があるため)、起こったと言っているドキュメントを読んでいます。 その説明に基づいて、私は次のように試してみました:

class Student { 
public: 
    Student(){} 
    void display() const{} 
    istream& operator>>(istream& is){return is;} 
    ostream& operator<<(ostream& os){return os; } 
}; 
int main() 
{ 
    Student st; 
    cin >> st; 
    cout << st; 

    getch(); 
    return 0; 
} 

をし、エラーメッセージました:「error C2679: binary '>>' : no operator found which takes a right-hand operand of type 'Student' (or there is no acceptable conversion)

を誰もが、私に明確な説明をしてください与えることはできますか?

答えて

0

関数がフレンド関数であるとは言えませんし、関数をインラインで含めることはできません。 friendキーワードは、関数がクラスで定義されていないことを意味しますが、クラスのすべてのプライベート変数と保護された変数にアクセスできます。コードを次のように変更してください。

class Student { 
    public: 
    Student(){} 
    void display() const{} 
    friend istream& operator>>(istream& is, Student& s); 
    friend ostream& operator<<(ostream& os, const Student& s); 
}; 

istream& operator >>(istream& is, Student& s) { return is; } 
ostream& operator <<(ostream& os, const Student& s) { return os; } 

別の例として、http://www.java2s.com/Code/Cpp/Overload/Overloadstreamoperator.htmをご覧ください。

< <と>>と、左手オペランドは常にファイルストリームなので、実際のクラス内ではオーバーロードできません(技術的にはファイルストリームクラスに入る必要があります)。

0

私はその演算子がどこで定義されているかを忘れていますが、グローバル演算子>>またはそのストリームに属する演算子のいずれかになります。

学生で定義するのは間違った場所です。

関連する問題