2015-10-06 3 views
3

Я знаю, что область действия директивы using ограничена блоком или функцией при вводе. Тогда он будет применяться только к этой области. Но если блок является namespace, он автоматически применяется ко всем блокам одного и того же пространства имен. Это верно? По крайней мере, следующий пример показывает, что: (http://ideone.com/K8dk7E)Сфера использования `namespace` в другом пространстве имен

namespace N1 
{ 
    struct Foo{}; 
} 

namespace N2 
{ 
    using namespace N1; 
    Foo f; 
} 

namespace N2 
{ 
    Foo f2; 
} 

int main() 
{ 
    N2::f2; 
} 

я ожидал Foo f2 дать ошибку, так как Foo должна быть неизвестна. Итак, мой реальный вопрос: есть ли инструкция using в блоке пространства имен, действующем для всех блоков одного и того же пространства имен?

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

+0

Вы спрашиваете, будут ли элементы N1 видны в расширении-namespace-определении N2? – SingerOfTheFall

+0

Мне кажется, что приведенный вами пример не очень хорошо иллюстрирует вашу проблему. С SUC код в сообщении компилируется просто отлично. – StoryTeller

+0

Вы уверены, что это не просто проблема с заказом, в который включены отдельные файлы? – StoryTeller

ответ

5

стандарт говорит, что (7.3.4/2)

U sing-directive указывает, что имена в названном пространстве имен могут использоваться в области, в которой применяется директива после использования директивы .

namespace A { \ 
int i = 9;  | <-- namespace A scope. 
}   /

namespace B {  \ 
using namespace A; | <-- namespace B scope. "i" is visible after 
void bar()   |  the "using namespace" line. 
{     | 
    i += 1; /*Ok*/ |  
}     | 
}    /

namespace B {  \ 
void foo()   | 
{     | <-- still namespace B scope. "i" is still visible 
    i += 1; /*Ok*/ | 
}     | 
}    /

Так вещи сделаны видимыми с помощью этой директивы будет видна везде в области видимости после using namespace B линии. Конечно, если вы сделаете это в файле заголовка, все материалы будут видны везде, где вы включаете этот заголовочный файл, поэтому вы не должны использовать «using namespace ...» в любом месте в заголовках.

+0

'i + = 1' может идти в пространстве имен? – 0x499602D2

+0

@ 0x499602D2, конечно, нет, я забыл обернуть его в функцию. благодаря – SingerOfTheFall

0

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

1

Является оператором using в блоке пространства имен, действующим для всех блоков одного и того же пространства имен?

Когда директива использования видна в блоке перевода (входит в комплект), да.

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

Для справки:

Смежные вопросы