fre*_*low 10 c++ visibility function overload-resolution
void foo(int)
{
}
class X
{
void foo()
{
}
void bar()
{
foo(42);
// error: no matching function for call to 'X::foo(int)'
// note: candidate is:
// note: void X::foo()
// note: candidate expects 0 arguments, 1 provided
}
};
Run Code Online (Sandbox Code Playgroud)
为什么C++无法调用自由函数(这是唯一具有正确签名的函数)?
ken*_*ytm 12
因为这两个标识符是在不同的范围内定义的,而重载解析只涉及同一范围内的函数.一旦编译器发现该类具有a foo,它就会停止攀升到更宽的范围(C++11§3.4.1/ 1),因此foo隐藏了自由函数.
您需要使用限定名称来引用全局foo:
::foo(42);
Run Code Online (Sandbox Code Playgroud)
合乎逻辑的原因是一致性.
foo(42)为
::foo(int).X::foo()到X::foo(int)随后
foo(42)将被解析为X::foo(int).哪个不一致.这就是为什么派生类函数在有相似名称时隐藏基类函数的原因.
这种情况可以通过两种方式解决;
(1)给出完全合格的名称(例如::foo(42))
(2)使用using效用; 例如
void bar()
{
using ::foo;
foo(42);
}
Run Code Online (Sandbox Code Playgroud)