2015-08-18 1 views
-1

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

Пример:

#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 { 

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

Может кто-нибудь объяснить это? Благодаря! Cheers

ответ

0

Тот же идентификатор может быть объявлен и использован в разных, возможно, вложенных областях, но не в одном и том же. Ваша проблема не имеет ничего общего с тем, что пространства имен определены в области файлов. Перемещение их в другое пространство имен 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 находятся в том же объеме.

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