c ++通过“使用”在另一个而不是封闭的命名空间中定义类

Gre*_*ree 3 c++ namespaces class definition

g++、icc 和 clang 接受以下代码:

namespace ns { struct A ; }
namespace ns1 // note : not enclosing namespace
{ 
    using namespace ns ;
    struct A { } ;
}  
Run Code Online (Sandbox Code Playgroud)

由于标准,这是一个有效的代码。?


[命名空间。qual ]#7: ... 然而,在这样的命名空间成员声明中,嵌套名称说明符可能依赖 using-directives 隐式提供嵌套名称说明符的初始部分

如相关答案所述

您可以省略nested-name-specifier 的初始部分,但不能省略任何中间部分。

(从我知道它可以/必须在封闭的命名空间中完成,我不记得了。)

son*_*yao 5

代码符合要求,但可能不会达到您的预期。

namespace ns 
{ 
    struct A ;      // declaration of ns::A
}
namespace ns1
{ 
    using namespace ns ;
    struct A { } ;  // definition of ns1::A, which has nothing to do with ns::A
} 
Run Code Online (Sandbox Code Playgroud)

请注意,命名空间内的任何声明都会成为该命名空间的成员,因此ns::Ans1::A是两个不相关的structs。