Почему возникает проблема, когда объект, определенный в области файла, имеет то же имя, что и существующее пространство имен? Почему это нормально в области действия функции (например, внутри 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 {
Эту ситуацию довольно легко достичь, если в нее включено много файлов, в которых определено много разных пространств имен.
Может кто-нибудь объяснить это? Спасибо!
ура
Один и тот же идентификатор может быть объявлен и использован в разных, возможно, вложенных областях, но не в одной и той же. Ваша проблема не имеет ничего общего с тем, что пространства имен определены в области видимости файла. Перемещение их в другое пространство имен 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
находятся в точно такой же области.
Поскольку большинство ваших переменных и пространств имен не должны объявляться в глобальной области / области файлов, наличие большого количества пространств имен вообще не является проблемой.