变量名称与函数名称相同,给出编译器错误...为什么?

时间:2016-01-19 21:17:16

标签: c++ scope declaration name-lookup name-hiding

今天进入了一个有趣的问题,我正在努力理解为什么。

请考虑以下事项:

class Base
{
public:
    Base(){}
    ~Base(){}
    static void function1(){}
        void function2()
        {
           int function1;
           function1 = 0;
           function1();   //<-compiler error
           function1 = 1;
        }
};

我收到以下错误:

  明显调用的括号前面的

表达式必须具有(指向 - )函数类型

我想我明白为什么会收到这个错误:

  1. function1之外调用function2()时,它实际上是指向function1()的函数指针。

  2. function2范围内,当声明int function1时,&#39; function1变量&#39;阴影&#39; function1函数指针&#39;。

  3. function1()内调用function2()时,假设function1是变量并且发出错误。

  4. 通过在Base::function1();内调用function2()来解决此问题。

  5. 我的问题是:为什么编译器在声明int function1;时没有出错?难道不允许这样做吗?

2 个答案:

答案 0 :(得分:9)

局部变量会覆盖本地块中方法的指示符。尽管如此,请尝试this->function1()进行调用。

或者更好的是,重命名这一个或另一个以帮助人们阅读您的代码以避免混淆(这包括您自己的未来)。

答案 1 :(得分:2)

回答你的问题:“是否允许这样做”:

在c ++中,如果它们存在于不同的范围内(如您的示例中),则可以使用具有相同名称的不同实体。这是非常有用的功能,因为它允许您使用您喜欢的任何名称,假设您在范围内提供它们,例如在命名空间。说,编译器在代码中看到名称时需要一些算法来选择实体。在c ++中,将名称与声明匹配的标准过程称为“名称查找”。你可以看到这个算法的描述,例如这里cppreference或直接在标准草案中。