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

Variable name same as function name giving compiler error... Why?

运行 今天遇到了一个有趣的问题,我正在尝试了解原因。

考虑以下几点:

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

我收到以下错误:

expression preceding parentheses of apparent call must have (pointer-to-) function type

我想我明白为什么会出现此错误:

  1. function1function2()之外被自己调用时,其实是指向function1().

    [=48=的函数指针]
  2. function2 的范围内,当声明 int function1 时,'function1 变量' 隐藏 'function1 函数指针'。

  3. 当在 function2() 中调用 function1() 时,它假定 function1 是变量并给出错误。

  4. 这可以通过在 function2() 中调用 Base::function1(); 来解决。

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

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

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

回答你的问题:"Should this be allowed":

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