如何使用与成员函数相同的名称来调用内联朋友函数?

如此处所述,C ++ 11风格的SFINAE和模板实例化类成员函数上的函数可见性会遮盖自由函数。 使用完全限定的名称通常有效,但是我很难与其他类的声明为联机的朋友函数。 考虑下面的例子:

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)?


这是因为friend缘故:

[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{});
        }
    };
}

(现场演示)

链接地址: http://www.djcxy.com/p/72935.html

上一篇: how do I call an inline friend function with the same name as a member function?

下一篇: Providing swap() for a C++ template class breaks std::swap()?