Подтвердить что ты не робот

Объявление нескольких пространств имен в С++

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

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

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

namespace foo::bar {
   baz();
}

?

4b9b3361

Ответ 1

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

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

namespace Foobar = Foo::Bar;

int main()
{
    Foobar::some_func();
}

Ответ 2

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

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

Обновление

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

namespace Foo::Bar::YetAnother {
  // do something even fancier!
}

Ответ 3

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

Ответ 4

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

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

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

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

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

Ответ 6

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

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

Ответ 7

Согласно грамматике в $2.10, идентификатор не может иметь токен ":". Поэтому имя foo::bar плохо сформировано.