2009-03-08 4 views

ответ

32

Вы близки, вы можете переадресовать объявить класс в пространстве имен, а затем определить его снаружи, если вы хотите:

namespace ns { 
    class A; // just tell the compiler to expect a class def 
} 

class ns::A { 
    // define here 
}; 

То, что вы не можете сделать, это определить класс в пространстве имен без членов, а затем определить класс снова за пределами пространства имен. Это нарушает правило Единого определения (или что-то бессмысленное).

+0

спасибо. это не более красноречиво, но, похоже, это имеет смысл. – 2009-03-08 17:17:14

+1

Я не думаю, что на самом деле существует более сжатая или читаемая версия, чем 'namespace ns {class A {}; } ', но это, вероятно, просто личное мнение. –

+0

Это разделение декларации и определения. – Shaowu

0

Нет, вы не можете. Процитируем стандарт C++, раздел 3.3.5:

А имя объявленной вне всех поименованные или безымянных пространств имен (7,3), блоки (6,3), весело (8.3.5), функция определения (8.4) и классы (пункт 9) имеет глобальную область видимости пространства имен

Так что заявление должно быть внутри блока пространства имен - определение может быть, конечно, за ее пределами.

+0

хорошо, класс А {}; это определение, а не декларация. Вы уверены, что цитата применима? – 2009-03-08 17:16:17

+0

определения - это декларации – 2009-03-08 17:17:57

+0

um, которые не были хорошо продуманы - но я уверен, что цитата применима - я еще раз посмотрю. – 2009-03-08 17:19:15

2

В разделе вы должны читать это:

7.3.1.2 определения членов пространств имен

3 Каждое имя первого объявлен в пространстве имен является членом этого пространства имен [.... ]

Обратите внимание на термин - декларация, так что D.Shawley (и его пример) верен.

7

Вы можете это сделать, но это не более сукцинта.

namespace ns { 
    class A; 
} 

class ns::A { 
}; 

Или

namespace ns { 
    class B; 
} 

using ns::B; 
class B { 
}; 
Смежные вопросы