更换这样的东西是否合法:
namespace foo {
namespace bar {
baz();
}
}
有这样的事情:
namespace foo::bar {
baz();
}
答案 0 :(得分:36)
您可以将命名空间合并为一个名称并使用新名称(即Foobar)。
namespace Foo { namespace Bar {
void some_func() {
printf("Hello World.");
}
}}
namespace Foobar = Foo::Bar;
int main()
{
Foobar::some_func();
}
答案 1 :(得分:13)
不,不是。而不是一堆缩进的嵌套命名空间,将它们放在同一行上当然是有效的:
namespace Foo { namespace Bar { namespace YetAnother {
// do something fancy
} } } // end Foo::Bar::YetAnother namespace
<强>更新强>:
You can now nest namespaces more cleanly in C++17:
namespace Foo::Bar::YetAnother {
// do something even fancier!
}
答案 2 :(得分:5)
合格的名称,如C ++中的something::someting_else
,只能用于引用之前已声明过的实体。您不能使用此类名称来介绍以前未知的内容。即使先前已经声明了嵌套命名空间,扩展该命名空间也被视为“引入新内容”,因此不允许使用限定名称。
您可以使用此类名称来定义先前在命名空间中声明的函数
namespace foo {
namespace bar {
int baz();
}
}
// Define
int foo::bar::baz() {
/* ... */
}
但未声明扩展现有命名空间的新命名空间。
答案 3 :(得分:5)
对于任何想知道的人,从C ++ 17开始支持namespace foo::bar
格式。参考文献:
答案 4 :(得分:4)
没有;这是一个语法错误。
答案 5 :(得分:1)
1&gt; C:\ ... \ foo.cpp(31):错误C2061:语法错误:标识符'bar'
之前
1&gt; C:\ ... \ fooo.cpp(31):错误C2143:语法错误:缺少';'在'{'
答案 6 :(得分:0)
根据$ 2.10中的语法,标识符不能包含令牌":"
。因此名称foo::bar
格式不正确。