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

标签 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;
        }
};

我收到以下错误:

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

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

  1. function1function2()之外被自己调用时,实际上是指向function1()的函数指针。

  2. function2 的范围内,当声明 int function1 时,'function1 变量'遮蔽'function1 函数指针'。

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

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

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

最佳答案

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

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

关于c++ - 变量名与函数名相同,给出编译器错误...为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34887070/

相关文章:

c++ - 派生类可以访问作为内部类的友元的父类的 protected 内部类的私有(private)方法吗?

c++ - 函数的返回类型可以从函数内部获取吗?

c - c中的指针问题

c++ - vector 、Size_type 和封装

使用现代 IDE 的小组的 C++ 编码标准

c - "static"变量的这个定义是错误的、误导性的还是两者都不是?

php - 了解 php 中的变量作用域

javascript - 在 JavaScript 类中处理 DOM 事件

javascript - 为什么变量声明总是可以覆盖函数声明?

swift - 这是什么意思 ?声明仅在文件范围内有效