2016-06-20 2 views
0

Учитывая следующее:Что такое указание имени класса в используемом заявлении?

namespace Foo{ 
class Bar{ 
    static const auto PRIVATE = 0; 
    const int private_ = 1; 
    void ptivateFunc() { cout << 2; } 
public: 
    static const auto PUBLIC = 3; 
    const int public_ = 4; 
    void publicFunc() { cout << 5; } 
}; 
} 

Заявление using Foo::Bar; компилирует ... Но я не уверен, что это предоставление мне доступ. Может ли кто-нибудь объяснить, в чем смысл этого заявления и что он даст мне доступ по отношению к Bar или просто делает using namespace Bar?

+1

Возможный дубликат [C++ с использованием оператора пространства имен] (http://stackoverflow.com/questions/7701891/c-using-namespace-statement) –

ответ

5

От cppreference:

использованием ns_name::name; (6)
(...)
6) using-declaration: делает символ name из пространства имен ns_name доступным для неквалифицированного поиска, как если бы он был объявлен в той же области класса класса, области объема или пространства имен, где это использование появляется.

с использованием пространства имен ns_name; (5)
5) using-directive: С точки зрения неквалифицированного поиска имени любого имени после директивы-указателя и до конца области, в которой она отображается, видно все имя из пространства имен как если бы оно было объявлено в ближайшем охватывающем пространстве имен, которое содержит как директиву, так и имя пространства имен.

Так в основном вы можете написать Bar вместо Foo::Bar вне пространства имен Foo (но внутри рамки с помощью декларирования), в то время как другие символы из пространства имен Foo еще нужны полное имя.

Если вы используете using namespace Foo, вы можете получить доступ ко всем символам в Foo по их местному имени без явного Foo::.

+0

Возможно, вы захотите включить, что это ограничено областью применения декларации использования. – NathanOliver

+0

", как если бы он был объявлен в той же области видимости класса, области блока или пространства имен, где появляется эта декларация использования" - так она указана в цитате, но я также добавил ее к объяснению. – Anedar

1

Это позволяет использовать Bar без Foo namespace.

+0

Так что это то же самое, что и 'using namespace Foo;', но это ограничивает охват экспозиции «Бар»? –

+0

@JonathanMee, точно. – SergeyA

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