Сегодня столкнулся с интересной проблемой и пытаюсь понять, почему.
Учтите следующее:
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
объявлен,function1
переменная ‘тени’function1
указатель на функцию ‘.
когда function1()
называется внутри function2()
, предполагает function1
является переменной и выдает ошибку.
Это исправлено звонком Base::function1();
внутри function2()
,
У меня такой вопрос: почему компилятор не выдает ошибку при объявлении int function1;
? Разве это не должно быть разрешено?
Локальная переменная перезаписывает обозначение метода в локальном блоке. Пытаться this->function1()
называть это все же.
Или, что еще лучше, переименуйте одно или другое, чтобы помочь людям, читающим ваш код, избежать путаницы (и это включает в себя ваше будущее).
Чтобы ответить на ваш вопрос: «Должно ли это быть разрешено»:
В C ++ у вас могут быть разные сущности с одинаковыми именами, если они существуют в разных областях (как в вашем примере). В целом это очень полезная функция, поскольку она позволяет вам использовать любые имена, которые вам нравятся, для ваших сущностей, при условии, что вы предоставляете их в области действия, например, в пространстве имен. Сказал, что компилятору нужен какой-то алгоритм для выбора сущности, когда он видит имя в коде. В c ++ стандартный процесс сопоставления имени с объявлением называется «поиск по имени». Вы можете увидеть описание этого алгоритма, например, Вот cppreference или прямо в стандартном проекте.