C++ 成员函数重载选择了错误的函数

C++ member function overloading picks wrong function

当尝试将全局函数重载为在其主体中调用全局函数的成员函数(具有不同数量的参数)时,MSVC 抛出错误 C2660。

此代码:

void f(int* x, int y) { *x += y; }

struct A
{
    int* x;
    inline void f(int y)
    {
        f(x, y); // tries to call A::f instead of f
    }

    void u(void)
    {
        f(5);
    }
};

出现此错误:

error C2660: 'A::f' : function does not take 2 arguments

使用 ::f(x, y); 以使用全局命名空间中的那个。

f 上的不合格名称查找将从最窄的范围开始,然后向外查找。当我们找到 A::f 时,我们停下来:我们已经找到了我们要找的东西。我们不继续了。此外,由于 A::f 是 class 成员,我们甚至不执行参数相关查找 - 我们只是停止。

要调用::f,您需要使用合格的调用:

::f(x,y);

您可能认为这个问题可以通过 using-declaration 来解决:

using ::f;
f(x,y);

这适用于这种情况。但是,我们仍然没有超载两个 f;由于同样的原因,任何调用成员函数的尝试都会失败:::f 将首先被发现,然后我们停止。