Определение класса в пространстве имен
-
05-07-2019 - |
Вопрос
Есть ли более краткий способ определить класс в пространстве имен, чем этот:
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
};
Чего вы не можете сделать, так это определить класс в пространстве имен без членов, а затем снова определить класс вне пространства имен. Это нарушает правило единого определения (или какую-то чепуху).
Другие советы
Вы можете это сделать, но на самом деле это не более лаконично.
namespace ns {
class A;
}
class ns::A {
};
Или
namespace ns {
class B;
}
using ns::B;
class B {
};
Раздел, который вы должны прочитать, это:
7.3.1.2 Определения членов пространства имен
3 Каждое имя, впервые объявленное в пространстве имен, является членом этого пространства имен. [...]
Обратите внимание на термин - декларация, поэтому Д.Шоули (и его пример) верны. Р>
Нет, ты не можешь. Чтобы процитировать стандарт C ++, раздел 3.3.5:
Имя, объявленное вне всех имен или безымянные пространства имен (7.3), блоки (6.3), веселье (8.3.5), функция определения (8.4) и классы (пункт 9) имеет глобальную область имен
Таким образом, объявление должно быть внутри блока пространства имен - определение, конечно, может находиться за его пределами.