2011-11-10 12 views
9

オペレータにこのようなネストされたプライベートクラスのオペレータをオーバーロードする方法< <?演算子<<のネストされたプライベートクラスのオーバーロードが可能ですか?

class outer { 
    private: 
    class nested { 
     friend ostream& operator<<(ostream& os, const nested& a); 
    }; 
    // ... 
}; 

外側のクラス・コンパイラの外側をしようとプライバシー文句:

error: ‘class outer::nested’ is private 

答えて

13

はあなたにもoperator<<outerの友人を作ることができます。それとも、 例えば、完全にnestedinlineそれを実現することができます。

class Outer 
{ 
    class Inner 
    { 
     friend std::ostream& 
     operator<<(std::ostream& dest, Inner const& obj) 
     { 
      obj.print(dest); 
      return dest; 
     } 
     // ... 
     // don't forget to define print (which needn't be inline) 
    }; 
    // ... 
}; 
+0

と目print関数は 'const'メンバ関数でなければなりません。 'std :: ostream&print(std :: ostream&out)const'の場合、' operator << 'は' return obj.print(dest); 'の1行にすぎません。 – Nawaz

+0

なぜstd:ostreamはInnerの友人である必要がありますか? – Mordachai

+1

それ以外の場合は 'Inner'で定義することはできません。 (Innerに定義されていない場合は、Innerは外部のprivateメンバーなので、Innerにはアクセスできないという問題があります。) –

6

を使用すると、2つの異なるファイル(HH、CPP)で同じことをしたい場合は、あなたが持っている友人2時間に次のように機能:

をHH:

// file.hh 
class Outer 
{ 
    class Inner 
    { 
     friend std::ostream& operator<<(std::ostream& dest, Inner const& obj); 
     // ... 
    }; 

    friend std::ostream& operator<<(std::ostream& dest, Outer::Inner const& obj); 
    // ... 
}; 

CPP:

// file.cpp: 
#include "file.hh" 

std::ostream &operator<<(std::ostream& dest, Outer::Inner const& obj) 
{ 
    return dest; 
} 
関連する問題