Есть более емкий способ определить класс в пространстве имен, чем это:Определения класса в пространстве имен
namespace ns { class A {}; }
Я надеялся, что-то вроде class ns::A {};
будет работать, но, увы, нет.
Есть более емкий способ определить класс в пространстве имен, чем это:Определения класса в пространстве имен
namespace ns { class A {}; }
Я надеялся, что-то вроде class ns::A {};
будет работать, но, увы, нет.
Вы близки, вы можете переадресовать объявить класс в пространстве имен, а затем определить его снаружи, если вы хотите:
namespace ns {
class A; // just tell the compiler to expect a class def
}
class ns::A {
// define here
};
То, что вы не можете сделать, это определить класс в пространстве имен без членов, а затем определить класс снова за пределами пространства имен. Это нарушает правило Единого определения (или что-то бессмысленное).
Нет, вы не можете. Процитируем стандарт C++, раздел 3.3.5:
А имя объявленной вне всех поименованные или безымянных пространств имен (7,3), блоки (6,3), весело (8.3.5), функция определения (8.4) и классы (пункт 9) имеет глобальную область видимости пространства имен
Так что заявление должно быть внутри блока пространства имен - определение может быть, конечно, за ее пределами.
хорошо, класс А {}; это определение, а не декларация. Вы уверены, что цитата применима? – 2009-03-08 17:16:17
определения - это декларации – 2009-03-08 17:17:57
um, которые не были хорошо продуманы - но я уверен, что цитата применима - я еще раз посмотрю. – 2009-03-08 17:19:15
В разделе вы должны читать это:
7.3.1.2 определения членов пространств имен
3 Каждое имя первого объявлен в пространстве имен является членом этого пространства имен [.... ]
Обратите внимание на термин - декларация, так что D.Shawley (и его пример) верен.
Вы можете это сделать, но это не более сукцинта.
namespace ns {
class A;
}
class ns::A {
};
Или
namespace ns {
class B;
}
using ns::B;
class B {
};
спасибо. это не более красноречиво, но, похоже, это имеет смысл. – 2009-03-08 17:17:14
Я не думаю, что на самом деле существует более сжатая или читаемая версия, чем 'namespace ns {class A {}; } ', но это, вероятно, просто личное мнение. –
Это разделение декларации и определения. – Shaowu