Законно ли заменить что-то вроде этого:
namespace foo {
namespace bar {
baz();
}
}
на что-то вроде этого:
namespace foo::bar {
baz();
}
?
Вы можете объединить пространства имен в одно имя и использовать новое имя (например, Foobar).
namespace Foo { namespace Bar {
void some_func() {
printf("Hello World.");
}
}}
namespace Foobar = Foo::Bar;
int main()
{
Foobar::some_func();
}
Полные имена, такие как something::someting_else
в C++, могут использоваться только для ссылки на объекты, которые уже были объявлены ранее. Вы не можете использовать такие имена, чтобы представить что-то ранее неизвестное. Даже если вложенное пространство имен уже было объявлено ранее, расширение этого пространства имен также рассматривается как «введение чего-то нового», поэтому полное имя не допускается.
Вы можете использовать такие имена для определения функций, ранее объявленных в пространстве имен
namespace foo {
namespace bar {
int baz();
}
}
// Define
int foo::bar::baz() {
/* ... */
}
,но не для объявления новых пространств имен расширения существующих.
Вы пробовали? Visual C++ выдает следующие ошибки:
1> C:\...\foo.cpp(31): ошибка C2061: синтаксическая ошибка: идентификатор 'bar'
1> C:\...\fooo.cpp(31): ошибка C2143: синтаксическая ошибка: отсутствует ';' до '{'
Нет, это не так. Вместо кучи вложенных пространств имен с отступом их, безусловно, можно разместить в одной строке:
namespace Foo { namespace Bar { namespace YetAnother {
// do something fancy
} } } // end Foo::Bar::YetAnother namespace
Обновление:
Теперь вы можете более аккуратно вкладывать пространства имен в C++17:
namespace Foo::Bar::YetAnother {
// do something even fancier!
}
Согласно грамматике в $2.10, идентификатор не может иметь токен ":"
. Таким образом, имя foo::bar
имеет неправильный формат.