имя объекта идентично имени пространства имен: переопределение

Почему возникает проблема, когда объект, определенный в области файла, имеет то же имя, что и существующее пространство имен? Почему это нормально в области действия функции (например, внутри main)?

Пример:

#include <iostream>

namespace foo {
class Foo {};
}

namespace bar {
class Bar {};
}

// foo::Foo foo; // <-- This will give error

int main () {
bar::Bar bar;  // <-- This is ok

std::cout << "Program ran successfully" << std::endl;
return 0;
}

Я получаю ошибку

ns_main.cpp:11:10: error: ‘foo::Foo foo’ redeclared as different kind of symbol
foo::Foo foo;
^
ns_main.cpp:3:15: error: previous declaration of ‘namespace foo { }’
namespace foo {

Эту ситуацию довольно легко достичь, если в нее включено много файлов, в которых определено много разных пространств имен.

Может кто-нибудь объяснить это? Спасибо!
ура

-1

Решение

Один и тот же идентификатор может быть объявлен и использован в разных, возможно, вложенных областях, но не в одной и той же. Ваша проблема не имеет ничего общего с тем, что пространства имен определены в области видимости файла. Перемещение их в другое пространство имен outer не решает ошибку:

#include <iostream>

namespace outer {
namespace foo {
class Foo {};
}

namespace bar {
class Bar {};
}
foo::Foo foo; // <-- This will still give an error
}

int main() {
outer::bar::Bar bar; // <-- This is still ok
}

Переменная bar в bar::Bar bar; однако принадлежит другой, более локальной области видимости, чем пространство имен bar, Переменная foo в foo::Foo foo; и пространство имен foo находятся в точно такой же области.

Поскольку большинство ваших переменных и пространств имен не должны объявляться в глобальной области / области файлов, наличие большого количества пространств имен вообще не является проблемой.

0

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


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