今天进入了一个有趣的问题,我正在努力理解为什么。
请考虑以下事项:
class Base
{
public:
Base(){}
~Base(){}
static void function1(){}
void function2()
{
int function1;
function1 = 0;
function1(); //<-compiler error
function1 = 1;
}
};
我收到以下错误:
明显调用的括号前面的表达式必须具有(指向 - )函数类型
我想我明白为什么会收到这个错误:
在function1
之外调用function2()
时,它实际上是指向function1()
的函数指针。
在function2
范围内,当声明int function1
时,&#39; function1
变量&#39;阴影&#39; function1
函数指针&#39;。
在function1()
内调用function2()
时,假设function1
是变量并且发出错误。
通过在Base::function1();
内调用function2()
来解决此问题。
我的问题是:为什么编译器在声明int function1;
时没有出错?难道不允许这样做吗?
答案 0 :(得分:9)
局部变量会覆盖本地块中方法的指示符。尽管如此,请尝试this->function1()
进行调用。
或者更好的是,重命名这一个或另一个以帮助人们阅读您的代码以避免混淆(这包括您自己的未来)。
答案 1 :(得分:2)
回答你的问题:“是否允许这样做”:
在c ++中,如果它们存在于不同的范围内(如您的示例中),则可以使用具有相同名称的不同实体。这是非常有用的功能,因为它允许您使用您喜欢的任何名称,假设您在范围内提供它们,例如在命名空间。说,编译器在代码中看到名称时需要一些算法来选择实体。在c ++中,将名称与声明匹配的标准过程称为“名称查找”。你可以看到这个算法的描述,例如这里cppreference或直接在标准草案中。