#include <iostream>
namespace outside {
struct A {
int outer = 42;
friend void print(A const& a, std::ostream& os)
{ os << "outside::A " << a.outer << '\n'; }
};
namespace inside {
struct A : outside::A {
int inner = 24;
void print(std::ostream& os) { } // Added for extra difficulty
friend void print(A const& a, std::ostream& os) {
// outside::A::print(a, os); // <- does not compile
os << " inside::A " << a.inner << '\n';
}
};
} // inside
} // outside
int main(int argc, char *argv[]) {
outside::A a_outside;
outside::inside::A a_inside;
print(a_outside, std::cout);
print(a_inside, std::cout);
}
Is there a way to qualify the print function so that both base and derived members are printed? I could move both the friend functions to their closest enclosing namespaces:
#include <iostream>
namespace outside {
struct A { int outer = 42; };
void print(A const& a, std::ostream& os)
{ os << "outside::A " << a.outer << '\n'; }
namespace inside {
struct A : outside::A {
void print(std::ostream& os) { } // Added for extra difficulty
int inner = 24;
};
void print(A const& a, std::ostream& os) {
outside::print(a, os); // <- works
os << " inside::A " << a.inner << '\n';
}
} // inside
} // outside
int main(int argc, char *argv[]) {
outside::A a_outside;
outside::inside::A a_inside;
print(a_outside, std::cout);
print(a_inside, std::cout);
}
This works, here's the result:
outside::A 42
outside::A 42
inside::A 24
Can the same be achieved with the friend functions though? Maybe using using
?
EDIT: inside::A::print(std::ostream&)
defeats the static cast suggest below, https://stackoverflow.com/a/22585103/710408. Any other options?