Многократное объявление пространства имен в C ++

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

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

на что-то вроде этого:

namespace foo::bar {
   baz();
}

?

17
задан Robert Mason 28 August 2010 в 02:35
поделиться

6 ответов

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

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

namespace Foobar = Foo::Bar;

int main()
{
    Foobar::some_func();
}
37
ответ дан 30 November 2019 в 10:10
поделиться

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

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

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

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

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

5
ответ дан 30 November 2019 в 10:10
поделиться

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

4
ответ дан 30 November 2019 в 10:10
поделиться

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

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

1
ответ дан 30 November 2019 в 10:10
поделиться

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

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

Обновление:

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

namespace Foo::Bar::YetAnother {
  // do something even fancier!
}
14
ответ дан 30 November 2019 в 10:10
поделиться

Согласно грамматике в $2.10, идентификатор не может иметь токен ":". Таким образом, имя foo::bar имеет неправильный формат.

0
ответ дан 30 November 2019 в 10:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: