Есть ли более краткий способ определения класса в пространстве имен, чем это:
namespace ns { class A {}; }
Я надеялся, что что-то вроде class ns::A {}; будет работать, но, увы, не.
Ответ 1
Вы близко, вы можете переслать объявление класса в пространстве имен и затем определить его на внешнем уровне, если хотите:
namespace ns {
class A; // just tell the compiler to expect a class def
}
class ns::A {
// define here
};
То, что вы не можете сделать, это определить класс в пространстве имен без членов, а затем снова определить класс за пределами пространства имен. Это нарушает правило одного определения (или что-то бессмысленное).
Ответ 2
Вы можете это сделать, но это не более succint.
namespace ns {
class A;
}
class ns::A {
};
или
namespace ns {
class B;
}
using ns::B;
class B {
};
Ответ 3
Раздел, который вы должны прочитать, следующий:
7.3.1.2 Определения членов пространства имен
3 Каждое имя, объявленное в пространстве имен, является членом этого пространства имен. [...]
Обратите внимание на термин - декларация, так что D.Shawley(и его пример) верен.
Ответ 4
Нет, вы не можете. Чтобы процитировать стандарт С++, раздел 3.3.5:
Имя, объявленное вне всех названных или неназванные пространства имен (7.3), блоки (6.3), fun (8.3.5), функция определения (8.4) и классы (пункт 9) имеет глобальную область пространства имен
Таким образом, объявление должно быть внутри блока пространства имен - определение может, конечно, быть вне его.