#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 уже объявлен.