Consider the following code:
struct A
{
friend void foo(A& a) {}
};
struct B
{
void foo()
{
A a;
foo(a); // doesn't compile because "foo" friend function is hidden
}
};
int main()
{
A a;
foo(a); // OK here
}
In function main, I can easily call friend function foo defined inside class A.
In function B::foo the same code doesn't compile because the friend function foo is hidden inside class B by its member function.
In there a way to call the original hidden function inside B, without renaming B::foo? I tried to use ::foo(a); or A::foo(a); but those don't compile neither.
Yes there is by adding the declaration
void foo(A& a)inside the member functionvoid B::foo()as shown below. This also meets your requirement that you don't want to renameB::foo.Basically we're making use of forward declaration here.
Working demo