Ошибка переопределения при использовании пространства имен - PullRequest
3 голосов
/ 02 августа 2011
// main.cpp
const double MAX = 3.5;

namespace ns
{
   const int MAX = 3;
}

int main()
{
}

приведет ли это к ошибке переопределения?

Я имею в виду эту страницу MSDN , в которой в разделе «Примечания» говорится, что это ошибка.

Обновление: я думаю, что могу пропустить одно важное утверждение при копировании вокруг кода.

using ns::MAX;

Ответы [ 2 ]

5 голосов
/ 02 августа 2011

Нет - я не понимаю, как этот код может вызвать ошибку переопределения.

И на самом деле, вы можете скомпилировать его и убедиться в этом .


РЕДАКТИРОВАТЬ: Теперь, когда вы указали ссылку на упомянутую вами страницу MSDN ...

На этой странице MSDN говорится о столкновениях имен в контексте using директива :

Если локальная переменная имеет то же имя, что и переменная пространства имен, переменная пространства имен скрыта.Ошибочно иметь переменную пространства имен с тем же именем, что и у глобальной переменной.

Вот пример локальной переменной, скрывающей переменную пространства имен, которая была введена в область видимостидиректива using:

namespace ns
{
   const int MAX = 3;
}

using namespace ns;

int main()
{
   int MAX = 4; // local
   int test = MAX;   // test is 4, because the local variable is used 
                     // as the namespace variable is hidden
}

Включение директивы using переносит все имена, объявленные в пространстве имен ns, в область видимости.Однако когда я присваиваю значение MAX для test, в назначении используется локальная переменная MAX, поскольку переменная пространства имен MAX скрыта.Локальная переменная имеет приоритет и скрывает переменную пространства имен.

Теперь вот пример столкновения между переменной пространства имен и глобальной переменной.Рассмотрим этот исправленный кусок кода (и вы можете увидеть, что он компилируется здесь ):

const double MAX = 3.5;

namespace ns
{
   const int MAX = 3;
}

using namespace ns;

int main()
{
   int test = MAX;
}

Опять же, директива using переносит ns:MAX в область видимости и глобальную переменную MAX также находится в области действия.

Когда я использую переменную с именем MAX в main(), компилятор сообщает об ошибке, поскольку имя MAX теперь неоднозначно: у него нет возможности узнатьо котором MAX мы имеем в виду, поскольку есть два нелокальных MAX на выбор: ни один не имеет никакого приоритета.

prog.cpp: In function ‘int main()’:
prog.cpp:13: error: reference to ‘MAX’ is ambiguous
prog.cpp:2: error: candidates are: const double MAX
prog.cpp:6: error:                 const int ns::MAX
prog.cpp:13: error: reference to ‘MAX’ is ambiguous
prog.cpp:2: error: candidates are: const double MAX
prog.cpp:6: error:                 const int ns::MAX
2 голосов
/ 02 августа 2011

Они не будут, потому что один находится в области файла, а другой в области пространства имен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...