C ++中的多个名称空间声明

问题描述 投票:17回答:7

替换这样的东西是合法的:

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

用这样的东西:

namespace foo::bar {
   baz();
}

?

c++ namespaces scope
7个回答
36
投票

您可以将名称空间组合成一个名称并使用新名称(即Foobar)。

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

namespace Foobar = Foo::Bar;

int main()
{
    Foobar::some_func();
}

12
投票

不,这不对。而不是一堆缩进的嵌套命名空间,将它们放在同一行上当然是有效的:

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!
}

5
投票

合格的名称,如C ++中的something::someting_else,只能用于引用之前已声明过的实体。您不能使用此类名称来介绍以前未知的内容。即使之前已经声明了嵌套命名空间,扩展该命名空间也被视为“引入新内容”,因此不允许使用限定名称。

您可以使用此类名称来定义先前在命名空间中声明的函数

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

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

但没有声明扩展现有命名空间的新命名空间。


5
投票

对于任何想知道的人,从C ++ 17开始支持namespace foo::bar形式。参考文献:


4
投票

没有;这是一个语法错误。


1
投票

你试过吗? Visual C ++给我以下错误:

1> C:\ ... \ foo.cpp(31):错误C2061:语法错误:标识符'bar' 1> C:\ ... \ fooo.cpp(31):错误C2143:语法错误:缺少';'在'{'之前


0
投票

根据$ 2.10中的语法,标识符不能包含令牌":"。所以foo::bar的名字是不正确的。

© www.soinside.com 2019 - 2024. All rights reserved.