C ++ с использованием оператора пространства имен - PullRequest
6 голосов
/ 09 октября 2011
namespace MyNamespace
{
    static void foo1()
    {

    }
}

using namespace MyNamespace;

class MyClass
{
    void foo2()
    {
        ::foo1();
    }    
};

Операция разрешения области действия :: означает использование метода в глобальном пространстве имен. Здесь мы можем использовать ::foo1(). Это означает, что метод foo1() находится в глобальном пространстве имен, я прав?

Мой вопрос: означает ли using namespace ANAMESPACE_NAME, что мы импортируем все элементы из пространства имен ANAMESPACE_NAME в глобальное пространство имен?

Ответы [ 4 ]

5 голосов
/ 09 октября 2011

Нет. «используя пространство имен ANAMESPACE_NAME» означает, что мы импортируем все элементы в текущую область.

Вы можете написать что-то вроде этого:

namespace A {
    int i = 10, j = 20;
}

int f()
{
    using namespace A;  // injects names from A into the global scope.
    return i * j;       // uses i and j from namespace A.
}

int k = i * j; // Error: undefined variant i and j.
3 голосов
/ 09 октября 2011

В разделе 3.4.3.4 стандарта C ++ 2003 есть ответ:

Имя с префиксом унарного оператора области :: (5.1) ищется в глобальная область видимости в единице перевода, где она используется. Имя должно быть объявленным в глобальной области имен или должно быть именем, объявление видимо в глобальной области видимости из-за директивы using (3.4.3.2).

Этот абзац практически идентичен в FDIS C ++ 11, поэтому, вероятно, он также сохраняется в C ++ 11.

3 голосов
/ 09 октября 2011

Здесь мы можем использовать :: foo1 (). Это означает, что метод foo1 () находится в глобальном пространстве имен, я прав?

Да, это правильно. Это означает вызов метода с именем foo1(), определенного в глобальном пространстве имен. Это называется Поиск квалифицированного пространства имен .

означает ли "использование пространства имен ANAMESPACE_NAME", что мы импортируем все элементы из пространства имен ANAMESPACE_NAME в глобальное пространство имен?

Да, он импортирует все элементы из пространства имен ANAMESPACE_NAME в текущее пространство имен.
Он называется с использованием директивы .
Если вы хотите импортировать только определенный элемент в текущем типе использования, используя объявление .

формат:

с использованием ANAMESPACE_NAME :: element_name;

0 голосов
/ 09 октября 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...