我有两个重载功能' func'。 func(int,int)在class外定义,func(int)在里面定义。如何从类的成员函数中调用func(int,int)?
#include <iostream>
using namespace std;
int func(int a, int b)
{ return a+b;}
class test
{
int a;
public:
int func(int);
int driver();
};
int test::func(int b)
{ return b;}
int test::driver()
{ return func(10,20);}
int main()
{
test A;
cout<<A.driver(); //ERROR: NO MATCHING FUNCTION TO CALL FUNC(INT,INT)
return 0;
}
答案 0 :(得分:8)
return ::func(10,20);
在名称前使用::
意味着查看全局命名空间。然后,它会找到全局func
,而不是类中包含的func
。
编辑:
该类中的 func
本身并没有超载全局func
,而是隐藏它。当func
在调用时开始查找时,它会首先找到test::func
,即使::func
是更好的匹配。更改名称或删除test::func
将删除查找遇到的第一个匹配项,它将继续进行,直到找到下一个匹配项::func
。
至于它为什么不在全局命名空间中启动,有很多原因。我不能代表那些设计它的人,但这些都是如果它被改变就会出现的问题。
1:任何在命名空间中编写代码的人都必须使用命名空间限定每个名称(std::cout
vs cout
)。如果不这样做,可能会导致错误变量发生变化的静默错误,具体取决于上面的范围内存在的错误。
2:不合格的查找会发现函数不太可能更快地与代码相关(您调用它的旁边的函数更可能与您的代码相关,而不是上面两个名称空间的不同头文件中的函数)你)。
3:函数将具有相反的变量查找。我无法在函数(void func() { int i; /*no*/func::i = 0;/*no*/}
)中指定局部范围,因此查找变量仍然必须从封闭范围开始并向外工作。两个人在相反的方向上工作是没有意义的。