以下代码显示了一个函数调用另一个函数 两者都有相同的名称,但签名不同 这按预期工作。
//declarations
void foo();
void foo(int);
int main(){
foo();
}
//definitions
void foo(){
foo(1);
}
void foo(int){}
我现在要做的唯一区别是将其中一个函数包装到一个结构中:
//declarations
struct Bar{
void foo();
};
void foo(int);
int main(){
Bar bar;
bar.foo();
}
//definitions
void Bar::foo(){
foo(1);
}
void foo(int){}
无法编译。
In member function ‘void Bar::foo()’:
error: no matching function for call to ‘Bar::foo(int)’
foo(1);
^
note: candidate: void Bar::foo()
void Bar::foo(){
^
note: candidate expects 0 arguments, 1 provided
当全局函数存在时,我不明白它为什么要调用foo(int)作为方法 它没有提到任何关于歧义的东西,它只是找不到功能。
为什么会发生这种情况,我该如何解决?
旁注:我将旧的C代码包装在C ++包装器中,并且大多数C ++方法都是对全局C函数的调用,这些函数隐式传入包装的结构。这与上面发生的情况类似(就编译器错误而言)。
答案 0 :(得分:9)
成员函数隐藏全局。它在类上下文中找到名称,因此它不会继续在其他上下文中搜索它。
你需要这样称呼它:
::foo(1);
另一种解决方案是在函数内部使用前向声明,如下所示:
void Bar::foo()
{
void foo(int);
foo(1);
}
正如Praetorian所说,这是另一种选择:
void Bar::foo()
{
using ::foo;
foo(1);
}