调用隐藏好友功能

pra*_*pin 4 c++ friend-function

考虑以下代码:

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
}
Run Code Online (Sandbox Code Playgroud)

在函数中main,我可以轻松调用foo类内定义的友元函数A

在函数中,B::foo相同的代码无法编译,因为友元函数通过其成员函数foo隐藏在类内部B

有没有办法调用原来的隐藏函数而B不用重命名B::foo?我尝试使用::foo(a);orA::foo(a);但它们都不能编译。

use*_*570 5

有没有办法在不重命名的情况下 调用 B 内部的原始隐藏函数B::foo

是的,可以通过在成员函数内添加声明 来实现,如下所示。这也满足了你不想重命名的要求。void foo(A& a)void B::foo()B::foo

基本上我们在这里使用前向声明。

struct A
{
    friend void foo(A& a) {}
};

struct B
{
    void foo()
    {
        A a;
        void foo(A&); //added this declaration
        foo(a); //compiles now
    }
};
Run Code Online (Sandbox Code Playgroud)

工作演示