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
将首先被发现,然后我们停止。
当尝试将全局函数重载为在其主体中调用全局函数的成员函数(具有不同数量的参数)时,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
将首先被发现,然后我们停止。