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

C++ C++;成员函数重载选择了错误的函数,c++,overloading,member-functions,C++,Overloading,Member Functions,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); } }

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
是类成员,我们甚至不执行依赖于参数的查找-我们只是停止

要调用
::f
,您需要使用符合条件的调用:

::f(x,y);

您可能认为这个问题可以通过使用声明来解决:


这在这种情况下有效。但是,我们仍然没有重载这两个
f
s;任何调用成员函数的尝试都会失败,原因是: >:f>代码>我们停止。

BTW,在C++中,不需要函数的“代码>空格< /代码>:<代码>空隙u>(<)/代码>也适用。@ HOLYBLCATE,这是我的新消息,但是我个人还是会为了完整性而做的。@ HolyBlackCat /同意CytMyg我从来没有使用过<代码> FO(空)<代码>因为我的C++背景,现在,在C中工作时,有一个非常糟糕的习惯,跳过它,导致编译器错误不断。FWIF,我建议他保持
(void)
ing,这对任何人都没有伤害,而且在我看来,养成这个习惯肯定会有帮助。编译器只是按照标准所说的那样工作。这是由你来学习规则…@ Prim1970我不关心标准,编译器做什么是重要的,并不是所有编译器都遵循复杂的混乱,也就是C++标准。(有点奇怪,考虑到甚至没有相同数量的论点,它无法理解)。这样它就更显式了。@Marg原因是你的函数不是一个重载,你没有得到任何类型的重载解析,它只是用相同的名字来隐藏全局函数。@RaphaelMiedl我明白了。即使我用C++编译,我也大多使用C,只在需要时使用。
using ::f;
f(x,y);