为什么我不能用类函数重载非类函数?

时间:2015-09-13 19:37:48

标签: c++

我有两个重载功能' 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;
}

1 个答案:

答案 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*/})中指定局部范围,因此查找变量仍然必须从封闭范围开始并向外工作。两个人在相反的方向上工作是没有意义的。