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