C++ C++;成员函数重载选择了错误的函数
MSVC在尝试将全局函数重载为调用其主体中全局函数的成员函数(具有不同数量的参数)时抛出错误C2660 此代码: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); } }
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;任何调用成员函数的尝试都会失败,原因是:(void)
ing,这对任何人都没有伤害,而且在我看来,养成这个习惯肯定会有帮助。编译器只是按照标准所说的那样工作。这是由你来学习规则…@ Prim1970我不关心标准,编译器做什么是重要的,并不是所有编译器都遵循复杂的混乱,也就是C++标准。(有点奇怪,考虑到甚至没有相同数量的论点,它无法理解)。这样它就更显式了。@Marg原因是你的函数不是一个重载,你没有得到任何类型的重载解析,它只是用相同的名字来隐藏全局函数。@RaphaelMiedl我明白了。即使我用C++编译,我也大多使用C,只在需要时使用。
using ::f;
f(x,y);