Законно ли заменить что-то вроде этого:Multiple объявление пространства имен в C++
namespace foo {
namespace bar {
baz();
}
}
с чем-то вроде этого:
namespace foo::bar {
baz();
}
?
Законно ли заменить что-то вроде этого:Multiple объявление пространства имен в C++
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();
}
+1 для информации, которую он не мог получить, просто спросив своего компилятора. –
еще одна ненужная, запутанная функциональность. –
Вы попробовали? Visual C++ дает мне следующие ошибки:
1> C: \ ... \ foo.cpp (31): ошибка C2061: синтаксическая ошибка: идентификатор 'бар'
1> C: \ ... \ fooo.cpp (31): ошибка C2143: синтаксическая ошибка: отсутствует ';' до '{'
Примечание. Просто потому, что что-то работает или не работает с конкретным компилятором, это не значит, что это стандарты или не соответствуют стандартам. –
@Billy: Что-то работающее ничего не значит. Что-то * не * работает. Если ваш компилятор не поддерживает функцию, то вы не можете ее использовать, независимо от того, что стандарт говорит по этому вопросу. –
@ Dennis: В то время как это правда, ОП не спрашивал, поддержит ли его или ее компилятор, (ы) он спросил, действительно ли это. –
Нет; это синтаксическая ошибка.
Нет, это не так. Вместо связки отступом вложенных пространств имен, это, конечно, действует, чтобы положить их на той же строке:
namespace Foo { namespace Bar { namespace YetAnother {
// do something fancy
} } } // end Foo::Bar::YetAnother namespace
Update:
You can now nest namespaces more cleanly in C++17:
namespace Foo::Bar::YetAnother {
// do something even fancier!
}
Квалифицированные имена, как something::someting_else
в C++ можно использовать только для обозначения лиц, которые уже были объявлены ранее. Вы не можете использовать такие имена, чтобы ввести что-то ранее неизвестное. Даже если вложенное пространство имен уже было объявлено ранее, расширение этого пространства имен также рассматривается как «введение чего-то нового», поэтому квалифицированное имя не допускается.
Вы можете использовать такие имена для определения функций, ранее объявленных в пространстве имен
namespace foo {
namespace bar {
int baz();
}
}
// Define
int foo::bar::baz() {
/* ... */
}
но не объявляя новые пространства имен, расширение существующих.
Согласно грамматике в $ 2,10, идентификатор не может иметь токен ":"
. Таким образом, имя foo::bar
плохо сформировано.
Это не означает многого, не указывая также, что здесь нужен идентификатор. 'foo :: bar', очевидно, действителен. –
Для кого-то интересно, форма namespace foo::bar
поддерживается с C++ 17. Ссылки:
, что это такое, что вы пытаетесь достичь этим? – Chubsdad
Это работает в C++ 17. –