C++ 如何调用与成员函数同名的内联友元函数?

C++ 如何调用与成员函数同名的内联友元函数?,c++,friend,overload-resolution,argument-dependent-lookup,C++,Friend,Overload Resolution,Argument Dependent Lookup,如本文所述,类成员函数掩盖了自由函数。使用完全限定的名称通常是有效的,但是我很难使用其他类的友元函数,这些函数是在线声明的。考虑下面的例子: namespace N { struct C { friend int f(const C& c) { return 1; } friend int g(const C& c) { return 2; } };

如本文所述,类成员函数掩盖了自由函数。使用完全限定的名称通常是有效的,但是我很难使用其他类的友元函数,这些函数是在线声明的。考虑下面的例子:

namespace N {

    struct C {
        friend int f(const C& c) {
            return 1;
        }
        friend int g(const C& c) {
            return 2;
        }
    };

    struct D {
        void f() {
            g(C{});            // ADL finds this
            ::N::f(C{});       // not found dispite full qualification
        }
    };
}
我想我理解问题所在,正如这里所描述的,内联友元函数通常是使用ADL找到的,在封闭的名称空间中并不真正可见


所以我的问题是,我应该如何更改代码以使其工作(除了重命名其中一个f之外)

这是因为
朋友

[C++11:7.3.1.2/3]:
如果非本地类中的友元声明首先声明了一个类或函数,则友元类或函数是最内部封闭命名空间的成员在该命名空间范围中提供匹配声明之前,通过简单的名称查找无法找到朋友的名称[…]。如果调用友元函数,则可以通过名称查找找到其名称,该名称查找考虑与函数参数类型(3.4.2)[即ADL]相关联的名称空间和类中的函数

解决方法是简单地提供该声明:

namespace N {

    struct C {
        friend int f(const C& c) {
            return 1;
        }
        friend int g(const C& c) {
            return 2;
        }
    };

    int f(const C& c);
    int g(const C& c);

    struct D {
        void f() {
            g(C{});
            ::N::f(C{});
        }
    };
}

()您是否尝试在命名空间范围()中声明
类C
并原型化friend函数?或者我误解了这个问题(我想我可能误解了)。我正在采取不同寻常的步骤回答并投反对票,因为从你链接到的问题的答案中,你应该很清楚这一点,如果您需要推动,您可以简单地要求对评论中的内容进行澄清。@LightnessRacesinOrbit Down投票很公平,回想起来,不转发declare::N::C::f是一个很大的疏忽。我应该删除这个问题吗?@PorkyBrain:不,是的okay@LightnessRacesinOrbit我想征求批评,我希望其他人会,这里令人敬畏的内容似乎被堆积如山的垃圾掩埋了,我想确保这个问题不被认为是垃圾的一部分。事实上,从标准引用来看,这似乎很明显,这已经在链接的问题中给出了,所以。。。