2011-11-10 15 views
9

¿Cómo se puede sobrecargar un operador < < para una clase privada anidada como esta?¿Operador de sobrecarga << para una clase privada anidada posible?

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

Al tratar fuera del compilador clase externa se queja de privacidad:

error: ‘class outer::nested’ is private 

Respuesta

13

puede crear el operator<< un amigo de outer también. O podría implementar por completo inline en nested, por ejemplo:

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

y TH La función de impresión debe ser una función de miembro 'const'. Si es 'std :: ostream & print (std :: ostream & out) const', entonces' operator << 'puede ser solo una línea:' return obj.print (dest); '. – Nawaz

+0

¿Por qué std: ostream necesita ser un amigo de Inner? – Mordachai

+1

Porque de lo contrario no puede definirlo en 'Inner'. (Y si no está definido en 'Inner', tiene el problema de que no puede acceder a' Inner', porque 'Inner' es un miembro privado de' Outer'.) –

6

si desea que la misma cosa en dos archivos diferentes (hh, CPP) que tiene a un amigo dos veces la función de la siguiente manera:

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; 
} 
Cuestiones relacionadas