【问题标题】:Variable name same as function name giving compiler error... Why?变量名与函数名相同会导致编译器错误...为什么?
【发布时间】:2016-01-19 21:17:15
【问题描述】:

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

考虑以下几点:

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

我收到以下错误:

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

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

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

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

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

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

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

【问题讨论】:

  • 你几乎是正确的,除了没有函数 pointers 涉及,只有函数。名称阴影是允许的,这就是它不是错误的原因。
  • -Wshadow,或者任何你的编译器调用它。
  • 您可以随时在新范围内声明任何名称,如果该名称已存在于外部范围内,它将隐藏相同的名称
  • 为什么你认为function1必须是一个指针? function1 是一个标识符,如果你在function2 中使用它,它会解析为int 类型的变量,你不能调用int 类型的变量。
  • 编译器具有使该代码示例正确编译所需的信息。但是,如果变量 function1 是函子或 lambda,那将是模棱两可的。根据您使用function1 的方式,它会变得非常混乱并且有相当多的模棱两可的用例,因此使用更简单的名称查找规则来禁止这种情况而不是试图弄清楚您的意图会更容易/更好。

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


【解决方案1】:

局部变量会覆盖局部块中方法的指示符。尝试this-&gt;function1() 调用它。

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

【讨论】:

  • 感谢您的回答!随意edit你的评论到你的答案
  • 谢谢。错误发生的地方似乎不直观。
【解决方案2】:

回答你的问题:“这应该被允许吗”:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-15
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2016-05-13
    • 2019-11-18
    相关资源
    最近更新 更多