2017-02-02 21 views
3

г ++, ККА и лязг принимает следующий код:C++ определение класса в другом, не заключая пространство имен с помощью «с помощью»

namespace ns { struct A ; } 
namespace ns1 // note : not enclosing namespace 
{ 
    using namespace ns ; 
    struct A { } ; 
} 

это правильный код из-за стандарт.?


[пространства имен. кача] # 7: ... Тем не менее, в таких заявлениях членов пространства имен, то вложенного имя спецификатор может полагаться на использование директив неявно обеспечивает начальной части вложенного-имя-спецификатор.

, как указано в соответствующих answer,

вы можете опустить начальную часть вложенного-имя-спецификатор, но не какая-либо промежуточная часть.

(откуда я получил, что он может/должно быть сделано в ограждающих пространство имен я не помню.)

ответ

4

код соответствует, но не может делать то, что вы ожидали.

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 
} 

Обратите внимание на любые объявления внутри пространства имен становятся членами этого пространства имен, так и ns::Ans1::A два нерелевантные struct с.

2

Код компилируется хорошо, но я согласен с ответом @ songyuangyao, также остерегайтесь затенения.

Например,

namespace ns 
{ 
    struct A ; 
    /* Calling A inside this scope will definitely refer to struct A defined in 
    this(ns) namespace, and everytime you want to access struct A of ns1, 
    you need to call it via ns1::A otherwise it will refer to ns::A (which is defined in 
    this namespace. 
    */ 
}  
namespace ns1 
{ 
    using namespace ns ; 
    struct A { } ; 
} 
Смежные вопросы