I find possible solution:
friend void print(A const& a, std::ostream& os) {
print(static_cast<const outside::A&>(a), os);
os << " inside::A " << a.inner << '\n';
}
Some info why this dont work: https://stackoverflow.com/a/382077/1938348
Conclusion is simple when you define friend
function in class body its invisible unless you use ADL.
To made it work as you excepted you need change place of declaration:
namespace outside {
struct A {
int outer = 42;
friend void print(A const& a, std::ostream& os);
};
void print(A const& a, std::ostream& os) {
os << "outside::A " << a.outer << '\n';
}
namespace inside {
struct A : outside::A {
int inner = 24;
friend void print(A const& a, std::ostream& os);
};
void print(A const& a, std::ostream& os) {
outside::print(a, os);
os << " inside::A " << a.inner << '\n';
}
} // inside
} // outside