Многократное объявление пространства имен в C ++ - PullRequest
17 голосов
/ 28 августа 2010

Законно ли заменить что-то вроде этого:

namespace foo {
   namespace bar {
      baz();
   }
}

с чем-то вроде этого:

namespace foo::bar {
   baz();
}

Ответы [ 7 ]

36 голосов
/ 28 августа 2010

Вы можете объединить пространства имен в одно имя и использовать новое имя (например, Foobar).

namespace Foo { namespace Bar {
    void some_func() {
        printf("Hello World.");
    }
}}

namespace Foobar = Foo::Bar;

int main()
{
    Foobar::some_func();
}
13 голосов
/ 28 августа 2010

Нет, это не так.Вместо множества вложенных вложенных пространств имен, безусловно, допустимо поместить их в одну строку:

namespace Foo { namespace Bar { namespace YetAnother {
    // do something fancy
} } } // end Foo::Bar::YetAnother namespace

Обновление :

Теперь вы можете вкладыватьпространства имен более чистые в C ++ 17 :

namespace Foo::Bar::YetAnother {
  // do something even fancier!
}
5 голосов
/ 28 ноября 2016

Для всех, кому интересно, форма namespace foo::bar поддерживается начиная с C ++ 17.Ссылки:

5 голосов
/ 28 августа 2010

Квалифицированные имена, такие как something::someting_else в C ++, могут использоваться только для ссылки на объекты, которые уже были объявлены ранее.Вы не можете использовать такие имена, чтобы ввести что-то ранее неизвестное.Даже если вложенное пространство имен уже было объявлено ранее, расширение этого пространства имен также рассматривается как «введение чего-то нового», поэтому полное имя не допускается.

Такие имена можно использовать для определения функций, ранее объявленных в пространстве имен.

namespace foo {
  namespace bar {
    int baz();
  }
}

// Define
int foo::bar::baz() {
  /* ... */
}

, но не объявлять новые пространства имен для расширения существующих.

4 голосов
/ 28 августа 2010

Нет;это синтаксическая ошибка.

1 голос
/ 28 августа 2010

Вы пробовали это?Visual C ++ выдает мне следующие ошибки:

1> C: \ ... \ foo.cpp (31): ошибка C2061: синтаксическая ошибка: идентификатор 'bar'1> C: \ ... \ fooo.cpp (31): ошибка C2143: синтаксическая ошибка: отсутствует ';'до '{'

0 голосов
/ 28 августа 2010

Согласно грамматике в $ 2,10, идентификатор не может иметь токен ":".Так что имя foo::bar плохо сформировано.

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