2012-05-06 4 views
4

今日はboost::asio::ip::addressのヘッダのソースコードに見て、次の行を見つけました:フレンドクラス定義

class address 
{ 
    // I removed some irrelevant lines here... 

    public: 

    /// Compare addresses for ordering. 
    friend bool operator>=(const address& a1, const address& a2) 
    { 
    return !(a1 < a2); 
    } 
}; 

は、今私はfriendが何のためにあるのかを知っているが、私はそれは定義が続く見たことがなかった、内クラス定義

私の質問は、このfriendの宣言は何ですか? operator>=はこちらの方法ではないようですが、staticキーワードもありません。

friendは、この特定のケースではstaticを置き換えますか?

答えて

2

はい、いいえ。演算子を呼び出すときに名前を修飾する必要がないため、staticを置き換えません。クラスインスタンスを呼び出す必要はありません。

それはクラスの外演算子を宣言するようなものだ:

class address 
{ 
    // I removed some irrelevant lines here... 

    public: 

    /// Compare addresses for ordering. 
    friend bool operator>=(const address& a1, const address& a2); 
}; 

inline bool operator>=(const address& a1, const address& a2) 
{ 
    return !(a1 < a2); 
} 

あなたはクラスからプライベートで保護されたメソッドにアクセスすることができます。

クラス内でストリーム演算子のオーバーロードを考えると、同じテクニックを適用できます。

+1

あなたの答えをありがとう。しかし、関数の名前空間はどうでしょうか?それはそれが宣言されている包含​​クラスと同じ 'namespace'を持っていますか? – ereOn

+0

@ereOnはそれを考えなかった。演算子を使用するクラスが必要なので、自動的に必要な名前空間に移動しますが、演算子自体が名前空間にあるかどうかはわかりません。 –

+0

実際には、クラスを囲む名前空間で宣言されているかのように動作します。 (まったく使われていないテンプレートの友達のようなコーナーケースを忘れてみましょう...)。 –

関連する問題