6

今天遇到一个有趣的问题,并试图了解原因。

考虑以下:

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

我收到以下错误:

明显调用括号前的表达式必须具有(指向)函数类型

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

  1. 当在function1外部被自己调用时function2(),它实际上是一个指向的函数指针function1()

  2. 在声明的范围内function2int function1function1变量”隐藏function1了“函数指针”。

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

  4. 这是通过调用Base::function1();inside来解决的function2()

我的问题是:为什么编译器在声明时不给出错误int function1;?这不应该被允许吗?

4

2 回答 2

12

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

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

于 2016-01-19T21:19:35.700 回答
3

要回答您的问题:“应该允许这样做”:

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

于 2016-01-19T21:36:36.277 回答