Чтобы увидеть приватные элементы P
, ваш operator<<
должен быть другом P
. Таким образом, чтобы иметь возможность получить доступ к определению класса C
:
class P {
class C {
...
};
friend std::ostream& operator<<(std::ostream &os, const C &c);
};
Затем ваш текущий оператор скомпилирует. Но он может получить доступ только к открытым членам C
, так как он является другом вложенного P
, но не вложенного C
:
std::ostream& operator<<(std::ostream &os, const P::C &c) {
return os;
}
Если вам также нужен доступ к закрытым членам C
, вам нужно быть двойным другом:
class P {
class C {
int x; //private
friend std::ostream& operator<<(std::ostream &os, const C &c); // to access private x
};
friend std::ostream& operator<<(std::ostream &os, const C &c); // to access private C
};
std::ostream& operator<<(std::ostream &os, const P::C &c) {
os<<c.x;
return os;
}