как решить конфликт имен между именем типа, именем функции и именем параметра?

#c

#c

Вопрос:

например, у меня есть этот код:

 struct Range
{
}

struct FooObj
{
     void Range(int x, Range** r){....}     //!< This is OK.
     void Foo(int x, Range** r) {....}      //!< This is Not OK, Why?
}
 

затем я исправляю функцию Foo(int,Range **) на:

 void Foo(int x, struct Range** r){...}
 

Коллизия имен решена, но почему функция Range() не имеет коллизии имен?

Кстати, я тестирую этот код в VS2010.

Комментарии:

1. Объявления вводят имена. Имена, которые они вводят, видны только после определенной точки объявления . Этот пункт находится после списка параметров для объявлений функций. Следовательно, имя Range (ссылающееся на Foo::Range ) отображается только после void Range(int, Range**) /* here */

Ответ №1:

Потому ::Foo::Range что скрывается ::Range . Посмотрите на этот более простой пример:

 int i;

void foo()
{
    int i;

    i = 1; // local variable `i`.
    ::i = 1; // global variable `i`.
}
 

Да. Q.E.D.

Чтобы использовать struct Range , просто используйте ::Range .

(И вам также необходимо удалить void of void Foo(.. . это конструктор. живой пример)

Ответ №2:

Нет прямого объявления Foo::Range (нет файла заголовка), поэтому во время компиляции Foo::Range столкновения имен нет. Но когда Foo::Foo компилируется, Foo::Range уже объявлен.