Имя переменной совпадает с именем функции, что приводит к ошибке компилятора … Почему?

Сегодня столкнулся с интересной проблемой и пытаюсь понять, почему.

Учтите следующее:

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

Я получаю следующую ошибку:

выражение перед круглыми скобками кажущегося вызова должно иметь (указатель на) тип функции

Я думаю, я понимаю, почему я получаю эту ошибку:

  1. когда function1 называется само по себе за пределами function2(), это на самом деле указатель на функцию function1(),

  2. Внутри сферы function2, когда int function1 объявлен,function1 переменная ‘тени’function1 указатель на функцию ‘.

  3. когда function1() называется внутри function2(), предполагает function1 является переменной и выдает ошибку.

  4. Это исправлено звонком Base::function1(); внутри function2(),

У меня такой вопрос: почему компилятор не выдает ошибку при объявлении int function1;? Разве это не должно быть разрешено?

3

Решение

Локальная переменная перезаписывает обозначение метода в локальном блоке. Пытаться this->function1() называть это все же.

Или, что еще лучше, переименуйте одно или другое, чтобы помочь людям, читающим ваш код, избежать путаницы (и это включает в себя ваше будущее).

7

Другие решения

Чтобы ответить на ваш вопрос: «Должно ли это быть разрешено»:

В C ++ у вас могут быть разные сущности с одинаковыми именами, если они существуют в разных областях (как в вашем примере). В целом это очень полезная функция, поскольку она позволяет вам использовать любые имена, которые вам нравятся, для ваших сущностей, при условии, что вы предоставляете их в области действия, например, в пространстве имен. Сказал, что компилятору нужен какой-то алгоритм для выбора сущности, когда он видит имя в коде. В c ++ стандартный процесс сопоставления имени с объявлением называется «поиск по имени». Вы можете увидеть описание этого алгоритма, например, Вот cppreference или прямо в стандартном проекте.

1

По вопросам рекламы [email protected]