2011-11-10 14 views
9

Come si può sovraccaricare un operatore < < per una classe privata nidificata come questa?Operatore di overloading << per una classe privata nidificata possibile?

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

Quando si cerca al di fuori del compilatore classe esterna si lamenta per la privacy:

error: ‘class outer::nested’ is private 

risposta

13

Si potrebbe fare il operator<< amico di outer pure. Oppure si potrebbe implementare completamente inline in nested, ad esempio:

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

e tH La funzione di stampa dovrebbe essere una funzione membro 'const'. Se è 'std :: ostream & print (std :: ostream & out) const', quindi' operator << 'può essere solo una riga:' return obj.print (dest); '. – Nawaz

+0

Perché std: ostream deve essere un amico di Inner? – Mordachai

+1

Perché non è possibile definirlo in 'Interno 'altrimenti. (E se non è definito in 'Interno', hai il problema che non può accedere a' Interno', perché 'Interno' è un membro privato di' Outer'.) –

6

se si desidera che la stessa cosa in due file diverso (hh, cpp) si deve ad un amico due volte la funzione come segue:

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; 
} 
Problemi correlati